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{}
,那么我可以做ArrayLista=newarraylist()代码>?
final ArrayList<?> dp1 = new ArrayList<String>();
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();