我试图理解泛型,但我在通配符边界和强制转换时遇到了阻碍。例如:
List<? extends Number> l = new ArrayList<>();
List<PositiveInteger> p = new ArrayList<PositiveInteger>();
p.add(new PositiveInteger(10));
l = p;
NegativeInteger ni = (NegativeInteger) l.get(0);// runtime java.lang.ClassCastException:
System.out.println(ni);
NegativeNumber 和 PositiveNumber 都扩展了 Number。所以问题是为什么在将列表中的元素转换为 NegativeNumber 时在编译时没有警告?有没有办法防止这种类型的异常?
最佳答案
好吧,如果你这样做,同样的事情会发生:
Object a;
Integer b = new Integer(5);
a=b
Double c = (Double)a;
ClassCastException 发生是因为您试图将一个类转换为另一个不是父/子类的类
关于预防的问题:
编译器不知道 l
中会有什么在运行时。但你可以使用 List<PositiveInteger>
而不是通配符来告诉编译器 l
中的内容.如果你必须使用 List<? extends Number>
您可以创建一个尝试转换对象的方法,这样您就可以判断对象是否为 List<PositiveInteger>
或 List<NegativeInteger>
喜欢here :
if(l instanceof List<NegativeInteger>){
//Do something
}
所以如果我相应地更改您的代码:
List<? extends Number> l = new ArrayList<>();
List<PositiveInteger> p = new ArrayList<PositiveInteger>();
p.add(new PositiveInteger(10));
l = p;
Object ni = l.get(0);
if(ni instanceof NegativeInteger){
NegativeInteger tmp = (NegativeInteger)ni;
System.out.println(ni);
}
关于Java 泛型未经检查的转换 - 通配符边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26864295/