Java泛型put-get规则
我在java中使用泛型时遇到了put-get规则,该规则规定不能将元素添加到Java泛型put-get规则,java,generics,collections,Java,Generics,Collections,我在java中使用泛型时遇到了put-get规则,该规则规定不能将元素添加到 <? extends something> ANavigableSetANavigableSet考虑以下示例,对您的代码稍作修改: NavigableSet<String> stringSet = new TreeSet<>(); NavigableSet<? super String> set = stringSet; set.add(new Object());
<? extends something>
ANavigableSetANavigableSet考虑以下示例,对您的代码稍作修改:
NavigableSet<String> stringSet = new TreeSet<>();
NavigableSet<? super String> set = stringSet;
set.add(new Object());
由于编译器不知道set
的值是否由另一个具有更严格类型约束的变量引用,因此它不允许在参数类型大于下限的情况下调用使用者方法
换句话说:编译器只知道set
可以包含String
s;它不知道它是否也可以包含对象。考虑一下这个示例,对您的代码进行一点修改:
NavigableSet<String> stringSet = new TreeSet<>();
NavigableSet<? super String> set = stringSet;
set.add(new Object());
由于编译器不知道set
的值是否由另一个具有更严格类型约束的变量引用,因此它不允许在参数类型大于下限的情况下调用使用者方法
换句话说:编译器只知道set
可以包含String
s;它不知道它是否也可以包含对象。(或文本null。您可以始终添加null,至少从类型角度来看是这样;但在运行时可能会失败)(或文本null。您可以始终添加null,至少从类型角度来看是这样;但在运行时可能会失败)
NavigableSet<String> stringSet = new TreeSet<>();
NavigableSet<? super String> set = stringSet;
set.add(new Object());
String s = stringSet.iterator().next();