Java 泛型 put-get 规则



我在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 .

最新更新