Java 泛型未经检查的转换 - 通配符边界

标签 java generics warnings

我试图理解泛型,但我在通配符边界和强制转换时遇到了阻碍。例如:

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/

相关文章:

java - android 只振动 15 秒

java使用getter和setter方法并返回0

构建器模式中的 java 类型推断

Python如何过滤特定警告?

c - 函数已定义但未在 C 中使用警告

java - foo 是什么意思?

JavaFX 在没有外部库的情况下创建弹出窗口

java - 通用子类型和通配符在 Collections.copy 中如何工作?

java - java中的通配符只适用于集合吗?

android - app :theme is now deprecated. 请改为使用 android:theme