Java泛型put-get规则

时间:2017-06-17 09:17:45

标签: java generics collections

我在java中使用泛型时遇到了put-get规则,它声明你不能将元素添加到

<? extends something>

集合,你不能把元素放在

<? super something>

集合。现在我遇到了以下代码:

NavigableSet<? super String> set = new TreeSet<>();
set.add(new Object());

我无法弄清楚为什么它不能编译。

我错过了什么吗?

2 个答案:

答案 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