这个问题在这里已有答案:
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