java – 创建无界和有界的通配符类型数组之间的区别?
为什么这段代码有效
ArrayList<?>[] arr = new ArrayList<?>[2]; 但以下两个不是? ArrayList<? extends Object>[] arr = new ArrayList<? extends Object>[2]; ArrayList<? super Object>[] arr = new ArrayList<? super Object>[2]; 最后两行生成编译错误;
请澄清差异. 更新 另一方面,ArrayList<?> [] arr = new ArrayList<?> [2];编译好但是 ArrayList<?> arr = new ArrayList<?>(); 不. 解决方法
这里有几个问题,让我们依次看看每个问题:
>类型绑定(即扩展对象)只能在声明类型时被声明,在实例化对象时不能使用. 例如 ArrayList的< ;?扩展对象> ab = new ArrayList<? extends Object>(); //错误 列表< Integer> [] arrayOfLists = new List< Integer> [2]; //编译时间错误 Oracle记录了此限制here的原因. ArrayList<?> [] arr = new ArrayList<?> [2]; 由于上述原因是有效的.然而,它的使用非常有限,因为只能将null分配给声明为<?> ;.的类型. arr [0] = null; //编译 arr [1] = new Object(); //编译时间错误 Oracle提供以下Guide on using wildcards,这将有助于了解何时使用这个通配符. 的ArrayList<?> arr = new ArrayList<?>(); //不编译 的ArrayList<?> arr2 = new ArrayList<(); //但是这样做 的ArrayList<?> arr3 = new ArrayList< String>(); //这样做 然而,仍然存在使用<?>只接受null. arr3.add(“”); //即使使用String实例化也不会编译 arr3.add(null); //编译很好 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |