我知道以下语法不合法:
void dolist2(List<? extends Number> list) {
list.add(new Integer(3));
}
但我不知道编译器如何知道它不合法。如果我查看 List.java 的源代码,我会看到:
boolean 值add(E e);
我认为这个声明没有任何特别之处,甚至没有像 @IllegalWhenInvokedOnUpperBoundReference 这样的注释。编译器如何知道强制执行此限制?如何对我自己的类(class)设置类似的限制?
最佳答案
它知道是因为 Integer
不是 ? extends Number
的实例。 ? extends Number
表示:未知类型,它是或扩展 Number。由于类型未知,编译器无法判断 Integer 是有效类型,因此拒绝编译。
您无法将字符串添加到 List<Integer>
要么,因为编译器知道 String 不扩展 Integer。类型检查是编译器的作用之一。
您似乎认为这是 List 具有而您的代码所没有的特殊功能。它不是。这只是泛型类型的规则:
public class Whatever<T> {
public void foo(T e) {
}
public static void main(String[] args) {
Whatever<? extends Number> w = new Whatever<Integer>();
w.foo(new Integer(4)); // won't compile
}
}
关于java - 如何让编译器禁止对上限引用进行方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373569/