通常在解释泛型时这样说:
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/