java - 嵌套的通配符和子类型。如何理解类型何时兼容?

标签 java generics type-conversion wildcard instantiation

通常在解释泛型时这样说:

List<?> list = new ArrayList<?>();

这段代码(上面)会产生错误,因为编译器不知道要实例化哪种类型。

但是

List<Set<?>> list = new ArrayList<Set<?>>();

这个(上面)编译的很好

还有这个:

List<Set<?>> list = new ArrayList<Set<String>>();

不编译。

我对此感到困惑。

您能否阐明不乱搞这些事情的完全权利。

附言

我知道

List<Number> list = new ArrayList<Integer>();

不会编译,我明白为什么。

最佳答案

好的。基本上,这个问题是要了解以下两个陈述之间的区别。根据@DavidWallace 的评论...

// good
Set<?> a_set = new HashSet<String>();

// bad
List<Set<?>> a_list = new LinkedList<Set<String>>();

使用引用 a_set , 您不能向集合中添加任何内容。因此,a_set 没问题。引用HashSet<String> .

但是,使用第二个引用 a_list ,您应该能够将任何集合放入列表中。但是,LinkedList<Set<String>>只允许添加 Set<String>到列表中。因此,如果允许这样做,您将无法阻止运行时异常的发生,这会破坏系统的类型安全。

关于java - 嵌套的通配符和子类型。如何理解类型何时兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26156760/

相关文章:

java - Eclipse 可以自动生成第三方库类的接口(interface)吗?

java - 将两种类型的数组转换为HashMap、TreeMap、LinkedHashMap

java - 使用 Java 进行 NAT 穿越

c# - 当我想在我的类/方法中使用不同类型时,是否有比泛型更好的 Ant 设计解决方案

Java 泛型,创建 Class<T> 的实例

java - 如何在java中从控制台隐藏不必要的Selenium调试消息

java - JSON 响应中的 @type

javascript - 在 Angular 模型中,可以在 JSON 对象和字符串之间切换值类型吗?

python - 将字符串(字母)从文件文本转换为整数

PHP 关联数组意外行为 - 为什么?