繁体   English   中英

Java泛型:为什么显式强制转换会导致编译器错误,但变量分配不会

[英]Java Generics: Why does an explicit cast cause a compiler error, but variable assignment does not

此块可正确编译:

ArrayList<Baz> list = savedInstanceState.getParcelableArrayList("foo");
bar(list);

但是此块错误表明无法将ArrayList<Parcelable>ArrayList<Baz>

bar((ArrayList<Baz>)savedInstanceState.getParcelableArrayList("foo"))

bar的形式:

private void bar(ArrayList<Baz> food) {
}

Baz是实现Parcelable接口的类

有没有一种方法可以执行直接转换,而不必执行隐式转换并创建不必要的变量?

这些块都是相同的。 以此为例进行编译:

import java.util.ArrayList;

public class Test<T> {

    public void test(){
        ArrayList<T> list = (ArrayList<T>)foo();
        bar(list);
        bar((ArrayList<T>)foo());
    }
    private ArrayList<Integer> foo(){ return null; }    
    private void bar(ArrayList<T> food) {}  
}

为了使用对方法bar(ArrayList<T> food) 引用 ,必须执行通用类型调用 ,该调用T替换为某些具体值。 T必须与其他类型绑定,引入诸如bar(ArrayList<?> food)类的通配符。

我遇到了同样的问题,我的解决方案是创建一种将Parcelable转换为Baz的方法。 例如..

private ArrayList<Baz> convertParcelableToBaz(ArrayList<Parcelable> parcelableList){
    ArrayList<Baz> bazList= new ArrayList<Baz>();
    for (int i = 0 ; i < parcelableList.size(); i++){
        bazList.add((Baz)parcelableList.get(i));
    }
    return bazList;
}

以便

ArrayList<Baz> list = convertParcelableToBaz(savedInstanceState.getParcelableArrayList("foo"));

并且没有未经检查的强制转换警告。

您得到的错误是什么? 我认为您只会收到一条警告,指出它是未经检查的演员。 在这种情况下,您需要将@SuppressWarnings("unchecked")到来自FROM的函数中。 老实说; 您最好创建一个单独的变量以捕获返回值,然后发送该变量。

您将在这里看到的问题之一是Java的类型擦除将伤害您。 如果在调用函数和接收函数之间声明T的方式不同,则删除T时,没有什么阻止任何人实际发送希望ArrayList为ArrayList的函数的。 这就是为什么这是类型安全问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM