博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?...
阅读量:6129 次
发布时间:2019-06-21

本文共 1793 字,大约阅读时间需要 5 分钟。

这一章节我们继续类型擦除的话题,我们将通过对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?

1.数组

package com.ray.ch13;public class Test {	public static void main(String[] args) {		Fruit[] fruits = new Apple[5];		fruits[0] = new Apple();		fruits[1] = new Fuji();		fruits[2] = new Fruit();	}}class Fruit {}class Apple extends Fruit {}class Fuji extends Apple {}
观察上面的代码,我们能够看到。尽管定义仅仅是Fruit 的数组。可是它能够放进去Apple、Fuji等子类型的对象,由于数组是持有对象的引用,并且能够在执行时向上转型。

2.泛型容器

一般使用方法:

package com.ray.ch13;import java.util.ArrayList;public class Test {	public static void main(String[] args) {		ArrayList
fruits = new ArrayList
(); fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Fuji()); }}class Fruit {}class Apple extends Fruit {}class Fuji extends Apple {}
上面是我们的经常使用使用方法。定义一个List容器。泛型里面填写的是同一个类型。

可是,我们以下将依据向上转型的特性,看看能不能像数组一样?

样例:

package com.ray.ch13;import java.util.ArrayList;public class Test {	public static void main(String[] args) {		// ArrayList
fruits = new ArrayList
();//error ArrayList
fruits = new ArrayList
(); // fruits.add(new Apple());//error // fruits.add(new Fruit());//error fruits.add(null);// 这里仅仅能是null,没有其它选择 }}class Fruit {}class Apple extends Fruit {}class Fuji extends Apple {}
观察上面的代码,本来我们想跟数组一样,在创建list的时候仅仅是把泛型定义为Fruit的子类,可是。编译器抛异常。

这是由于泛型不是全然定义,它仅仅是在编译器检查类型安全。在执行期就没有泛型的概念了。而当我们定义的时候是通过通配符“?”来定义,也就是说我能够放进去Fruit的本身或者子类,编译器能够知道,可是在执行期。jvm仅仅是知道放进来Object。而在创建的时候是定义了Apple子类。尽管编译器知道。可是在执行期。jvm也仅仅是知道放进来Object,这个时候在执行期就会引起类型安全的问题。因此,当我们放进去什么对象都会引起类型安全的时候,编译器仅仅能给出null这个选项,不然就必定会出现类型安全的风险。

总的来说,由于数组是全然定义,在编译器和执行期都会进行类型检測,或者说数组本身就是持有对象,而泛型容器仅仅是在编译器检查类型安全。而在执行期全是Object,仅仅是半定义。或者说泛型容器不持有对象,才导致上面所展示的问题。

总结:这一章节我们主要对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题。

这一章节就到这里。谢谢。

-----------------------------------

转载地址:http://ciiua.baihongyu.com/

你可能感兴趣的文章
Ubuntu 自动关机命令
查看>>
剑指offer---复杂链表的复制
查看>>
spring 集成的项目,Properties配置文件外移
查看>>
Codeforces 842B Gleb And Pizza【几何,水】
查看>>
Spring与Junit测试整合
查看>>
Free Pascal初次体验(有亮点哦)
查看>>
2017-5-15 if语句的使用
查看>>
牛客网剑指offer-Java
查看>>
[UI]抽屉菜单DrawerLayout分析(三)
查看>>
黄聪:使用Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)...
查看>>
黄聪:Wordpress如何不显示(只显示)置顶文章
查看>>
黄聪:使用Add-on SDK开发火狐扩展
查看>>
javascript 网页中实现一个计算当年还剩多少时间的倒数计时程序
查看>>
hibernate_exercise-many- to-one(1)
查看>>
防止用户同时使用一个存储过程
查看>>
(转载)使用SQL-Server创建一个银行数据管理系统Ⅰ
查看>>
SQL Server:查询当前服务器有多少连接请求
查看>>
oracle开发技巧
查看>>
toString()方法
查看>>
EXCEL函数2—vlookup函数等
查看>>