从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
2023-09-11 14:14:09 时间
这一章节我们继续类型擦除的话题,我们将通过对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
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<Fruit> fruits = new ArrayList<Fruit>(); 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<Fruit> fruits = new ArrayList<Apple>();//error ArrayList<? extends Fruit> fruits = new ArrayList<Apple>(); // 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,仅仅是半定义。或者说泛型容器不持有对象,才导致上面所展示的问题。
总结:这一章节我们主要对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题。
这一章节就到这里。谢谢。
-----------------------------------
相关文章
- java - 详解 Java 17 中新推出的密封类
- Java 容器篇
- Java 服务 Docker 容器化最佳实践
- 【Java】java基本知识
- 【Java】DTO对象转换
- maven项目的java和resources等文件夹不在Java Resources的文件夹里,并且缺少Deployment...
- Java中toArray的用法探究(java数组与list转换)
- java.rmi.ConnectException: Connection refused to host: 127.0.0.1
- Tomcat 奔溃:java.lang.OutOfMemoryError: Java heap space
- 《21天学通Java(第6版)》—— 2.10 认证练习
- 1. java.util.concurrent - Java 并发工具包
- JAVA好书之《深入理解Java虚拟机》
- Java中数组定义的三种方式
- QVariant(相当于是Java里面的Object,是万能的容器,但要注册)
- java.lang.OutOfMemoryError: Java heap space解决方法
- Java并发编程:并发容器之ConcurrentHashMap(转载)
- Java_jdbc 基础笔记之十四 数据库连接(元数据)数据库信息及连接信息
- 『Java练习生的自我修养』java-se进阶⁴ • IO流概览
- 『Java练习生的自我修养』java-se进阶¹ • 初识多线程
- java项目之疫情网课管理系统(springboot+vue源码)
- java枚举的线程安全及序列化
- 使用Eclipse载入一个现有的java项目
- 2013编程之美资格赛之长方形(Java实现)
- Java 接口
- Java面试全解析——505道面试题详解