当我阅读这个我不明白的源代码示例时,我正在阅读Angelika Langer撰写的出色的Java Generics FAQ。
import java.util.List;
import java.util.ArrayList;
import java.lang.Number;
import java.lang.String;
import java.lang.Long;
class X<T extends List<? extends Number>> {
public void someMethod(T t) {
t.add(new Long(0L)); // error
Number n = t.remove(0);
}
}
我不明白为什么编译器在类型擦除之前不能推断出“ Long extended Number”并将其与“?extended Number”匹配,从而使它<? extends Number>
完全无用。
我已经阅读了常见问题解答,因此,我正在寻找更简单的解释以及替代方法。
提前致谢
假设有人以这种方式使用您的班级:
List<Double> list = new ArrayList<>();
X<List<Double>> x = new X<>();
x.someMethod(list);
现在,你的方法会尝试将添加Long
到List<Double>
。这就是编译器不允许的原因。
您不能将添加Long
到List<? extends Number>
,因为List<? extends Number>
可以将分配List<Double>
给List<Integer>
,,等等。
您可以将类声明更改为X<T extends List<Number>>
,这将解决编译错误,因为List<Number>
您可以始终向中添加Long
(或的任何其他子类的实例Number
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句