Java 为什么ArrayList<;ArrayList<&燃气轮机&燃气轮机;列表=新阵列列表<;ArrayList<;字符串>&燃气轮机;()不编译?

Java 为什么ArrayList<;ArrayList<&燃气轮机&燃气轮机;列表=新阵列列表<;ArrayList<;字符串>&燃气轮机;()不编译?,java,generics,Java,Generics,这段代码为什么要编译 final ArrayList<?> dp1 = new ArrayList<String>(); final ArrayList dp1=new ArrayList(); 但事实并非如此 final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>(); final ArrayList理解起来相当复杂,但总而言之,在第一

这段代码为什么要编译

final ArrayList<?> dp1 = new ArrayList<String>();
final ArrayList dp1=new ArrayList();
但事实并非如此

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

final ArrayList理解起来相当复杂,但总而言之,在第一个代码中,
String
扩展了
,但第二个没有编译,因为
ArrayList
没有直接继承自
ArrayList
,如果需要所有细节,可以查看。 如果要编译第二个示例,必须将其修改为:

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

类型参数
ArrayList
(一个参数化类型,其中
仅代表某个未知类型,与
字符串
无关)不是通配符,通配符应该是
?扩展ArrayList
,使用上界
ArrayList
,它实际上是
ArrayList
的超类型


您可以在参数化类型中阅读有关super/subset/type的规则。

请参阅:why(为什么)稍微复杂一点。但是,这将编译:final ArrayList>dp2=new ArrayList();这是否意味着-如果我有
类P{}
并且
类C扩展了P{}
,那么我可以做
ArrayList

a=newarraylist()

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