![](/img/trans.png)
[英]Why does an empty lambda and constructor with an explicit return cause a compiler error (Java Bug?)
[英]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.