为什么ArrayList <ArrayList <?>> list = new ArrayList <ArrayList <String >>()不能编译?

Leo*_*nid 11 java generics

为什么这段代码会编译

final ArrayList<?> dp1 = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

但事实并非如此

final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)

gma*_*gma 6

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

final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)


Bhe*_*ung 6

final ArrayList<?> dp1 = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

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

但在

final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)

类型参数ArrayList<?>(参数化类型,其中?只代表某些未知类型,并且与之无关String)不是通配符,通配​​符将是? extends ArrayList<?>上限ArrayList<?>,实际上是超类型ArrayList<String>.

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