ArrayList<?>[] arr = new ArrayList<?>[2];
但以下两个不是?
ArrayList<? extends Object>[] arr = new ArrayList<? extends Object>[2]; ArrayList<? super Object>[] arr = new ArrayList<? super Object>[2];
error: generic array creation.
请澄清差异.
更新
另一方面,ArrayList<?> [] arr = new ArrayList<?> [2];编译好但是
ArrayList<?> arr = new ArrayList<?>();
不.
解决方法
>类型绑定(即扩展对象)只能在声明类型时被声明,在实例化对象时不能使用.
例如
ArrayList的< ;?扩展对象> ab = new ArrayList<? extends Object>(); //错误
ArrayList的< ;?扩展对象> ac = new ArrayList< String>(); // 好的
>数组不支持类型参数,例如:
列表< Integer> [] arrayOfLists = new List< Integer> [2]; //编译时间错误
列表与LT;整数> list = new List< Integer>(); // 好的
Oracle记录了此限制here的原因.
><?>可以在声明一个类型参数和数组时使用.它被添加以帮助在混合使用和不使用泛型的Java代码时避免“未检查的异常”错误.这意味着“未知的通用类型”.无限通卡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); //编译很好