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

回到顶部