java 泛型 ??
param 的实际类型是 Pair<Interger> , 为什么不能赋值给 Number 呢 ?有朋友说,<? super Integer> 中的 ?可能是 Integer 可能是 Number 可能是 Object, 但是,传给 pairTest 的实际类型就是 Pair<Integer> 啊 ,不可能是其他类型( 比如 Pair<Object> )呀 ? 难道编译器没看到吗 ?
回答:
? super Integer
可能是 Integer
可能是 Number
可能是 Object
不一定是 Number
所以不能直接赋值
回答:
楼上已经说的很明白了,你没有考虑到 传给 pairTest 的 pair<T> 这个T类型可以有很多(比如这个pair1),你怎么确保Number就能接收这个类型T呢?
public static void main(String[] args) { Pair<Integer> pair = new Pair<>(100, 200);
pairTest(pair);
Pair<Object> pair1 = new Pair<>("first", "last");
pairTest(pair1);
}
public static void pairTest(Pair<? super Integer> param) {
Number number = param.getFirst();
}
其实如果你就非要Number类型,你还可以将泛型通配符改成继承Number,这样就不会报错:
public static void pairTest(Pair<? extends Number> param) { Number number = param.getFirst();
}
回答:
即便你声明Pair对象的代码就在上面不远处,编译器也不会认为方法的传参都像你声明的Pair对象那样。ide会从声明一个方法的角度来看,这个方法的入参被你定义成Pair<? super Integer>,也就意味着只要入参Pair对象的泛型是Integer的任何父类,这个入参对象都是合理的。在Integer的所有父类中,至少有Object不是Number的实现。因此你的方法声明允许一个Pair<Object>对象传入,但是你在方法中却没有考虑处理这种情况,所以才会报错。
以上是 java 泛型 ?? 的全部内容, 来源链接: utcz.com/p/945422.html