我在java中使用泛型时遇到了put-get规则,它声明你不能将元素添加到
<? extends something>
集合,你不能把元素放在
中<? super something>
集合。现在我遇到了以下代码:
NavigableSet<? super String> set = new TreeSet<>();
set.add(new Object());
我无法弄清楚为什么它不能编译。
我错过了什么吗?
答案 0 :(得分:1)
NavigableSet<? super String>
可以是NavigableSet<String>
。在这种情况下,添加Object
会产生问题,Java在编译时会停止。
您可以添加到此类集中的唯一内容是String
。
答案 1 :(得分:1)
考虑这个例子,稍微修改你的代码:
NavigableSet<String> stringSet = new TreeSet<>();
NavigableSet<? super String> set = stringSet;
set.add(new Object());
这不会编译。如果是这样,那将是不安全的类型:
String s = stringSet.iterator().next();
因为编译器不知道set
的值是否被另一个具有更严格类型约束的变量引用,所以它不允许调用参数类型比下面更宽的消费者方法界。
换句话说:编译器只知道set
可以包含String
s;它不知道它是否也可以包含Object
。