java – 创建无界和有界的通配符类型数组之间的区别?

前端之家收集整理的这篇文章主要介绍了java – 创建无界和有界的通配符类型数组之间的区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么这段代码有效
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的&LT ;?扩展对象> ab = new ArrayList<? extends Object>(); //错误
ArrayList的&LT ;?扩展对象> 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分配给声明为<?&gt ;.的类型. 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); //编译很好

原文链接:https://www.f2er.com/java/123208.html

猜你在找的Java相关文章