问题 为什么ArrayList > list = new ArrayList >()不能编译? [重复]


这个问题在这里已有答案:


8451
2018-05-24 14:21


起源

看到: stackoverflow.com/q/440262/630384 - DHall
'为什么'有点复杂。但是,这将编译: final ArrayList <? extends List <?>> dp2 = new ArrayList <ArrayList <String >>(); - Sheldon Warkentin


答案:


final ArrayList<?> dp1 = new ArrayList<String>();

类型参数 ? 是一个通配符,它​​是超集(不是超类型)的 String。所以, ArrayList<?> 是超级类型的 ArrayList<String>

但在

final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

类型参数 ArrayList<?> (参数化类型在哪里 ? 只代表一些未知的类型,并没有任何关系 String)不是通配符,通配​​符就是 ? extends ArrayList<?>,有一个上限 ArrayList<?>,实际上是超类型 ArrayList<String>

您可以在参数化类型中阅读有关超级/子集/类型的规则 这里


6
2018-05-24 14:39





理解它很复杂,但总结在你的第一个代码中, String 扩展 ? 但第二个不编译,因为 ArrayList<String> 不直接继承自 ArrayList<?> 你可以看 这里 如果你想要所有的细节。 如果您想要编译第二个示例,则必须将其修改为:

final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

6
2018-05-24 14:38



这是否意味着 - 如果我有的话 class P { } 和 class C extends P { } 那我就能做到 ArrayList<P> a = new ArrayList<C>();? - Bhesh Gurung