加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:12:13 所属栏目: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: gener
为什么这段代码有效
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); //编译很好

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读