我在java中使用泛型时遇到了put-get规则,该规则指出您不能将元素添加到
<? extends something>
集合,你不能把元素放在一个
<? super something>
收集。现在我遇到了以下代码:
NavigableSet<? super String> set = new TreeSet<>();
set.add(new Object());
而且我不知道为什么它不编译。
我错过了什么吗?
考虑这个例子,对代码的轻微修改:
NavigableSet<String> stringSet = new TreeSet<>();
NavigableSet<? super String> set = stringSet;
set.add(new Object());
这不会编译。如果是这样,这将是不安全的类型:
String s = stringSet.iterator().next();
由于编译器不知道 set
的值是否由具有更严格类型约束的另一个变量引用,因此它不允许调用参数类型宽于下限的使用者方法。
换句话说:编译器只知道set
可以包含String
;它不知道它是否可以包含Object
NavigableSet<? super String>
可以是NavigableSet<String>
。 在这种情况下,添加Object
会产生问题,Java 在编译时会停止这些问题。
您唯一可以添加到此类集合中的是 String
.