JavaSE 语法基础--- 泛型(基础知识问答)
Posted RAIN 7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE 语法基础--- 泛型(基础知识问答)相关的知识,希望对你有一定的参考价值。
文章目录
如果没有泛型?
java在推出泛型之前。程序员可以构建一个 元素类型为 Object 的集合,该集合可以存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道 每个元素的数据类型 ,否则很容易引发类型转换异常。
下面这个图就说明了如果没有泛型的话,我们可以存储任意类型的数据
缺点
取数据的时候,得强制类型转换,还得记得每一个数据的类型是什么,如果转换错误,还会发生类型转换异常的错误(编译时无错,运行时有错)
什么是泛型,介绍一下泛型?
Java中的泛型是 JDK5中引入的一个新特性,泛型本质就是类型参数化,也就是将所操作的数据类型指定为一个参数。
各个版本泛型的使用及变化说一下?
在 Java SE 1.5 之前没有泛型的情况的下只能通过对类型 Object 的引用来实现参数的任意化,其带来的缺点是要做显式强制类型转换,而这种强制转换编译期是不做检查的,容易把问题留到运行时
JDK 1.5 引入了泛型来允许强类型在编译时进行类型检查;
JDK 1.7 泛型实例化类型具备了自动推断能力,譬如 List list = new ArrayList(); 可以写成 List list = new ArrayList<>(); 了,JDK 具备自动推断能力。
泛型的意义?
1.存数据的时候,编译期间检查数据类型
2.取数据的时候,进行类型的自动转换
泛型的好处?
1.代码更加简洁【不用强制转换】
2.程序更加健壮【只要编译时期没有警告,那么运行时就不会抛出ClassCastException的异常】
3.可读性和稳定性【在编写集合的时候,就限定了类型】
1. Java中的泛型是什么 ? 使用泛型的好处是什么?
Java中的泛型是 JDK5中引入的一个新特性,泛型提供了编译时类型检查的机制,如果数据类型不是指定的类型的话编译时就会报错。
泛型本质就是类型参数化,也就是将所操作的数据类型指定为一个参数。
1.存数据编译期间检查数据类型
2.取数据进行类型的自动转换
2. Java的泛型是如何工作的 或者 什么是类型擦除 ?
当编译器对带有泛型的java代码进行编译时,它会去执行类型检查和自动推断,与泛型相关的信息会被擦除掉,生成普通的不带泛型的字节码文件,这种普通的字节码可以被一般的 Java 虚拟机接收并执行,这在就叫做 类型擦除(type erasure)。
泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除
在泛型类被类型擦除的时候,之前泛型类中的类型参数部分
如果没有指定上限,如 则会被转译成普通的 Object 类型,
如果指定了上限如 则类型参数就被替换成类型上限。
Java 泛型类、泛型接口、泛型方法有什么区别?
泛型类
泛型类的定义语法
class 类名<泛型标识,泛型标识,...>
private 泛型标识 变量名;
泛型类的使用
泛型类在创建对象的时候,来指定操作的具体数据类型,如果没有指定的话,就默认按照Object类型来进行操作。
泛型类,不支持基本数据类型,只支持引用类型。
同一个泛型类,根据不同的数据类型创建对象,本质上都是同一类型,类型在编译时会被擦除。
类名<具体的类型> 对象名 = new 类名<具体的类型>()
jdk1.7之后,后面<> 能够自动推断,所以可以省略不写
泛型接口
泛型接口的定义语法
interface 接口名<泛型标识,泛型标识,...>
泛型表示 方法名;
泛型接口的使用
实现泛型接口的类,不是泛型类,需要明确实现泛型接口的数据类型
如果没有说明接口的数据类型,默认是Object
实现泛型接口的类,是一个泛型类,那么要保证实现接口的泛型类要和接口泛型保持一致或者包含
泛型方法
修饰符 <T> 返回值类型 方法名(形参列表)
方法体
只有声明了 的方法才是泛型方法,泛型类中的成员方法不是泛型方法
什么是泛型中的限定通配符和非限定通配符 ?
限定通配符对类型进行了限制。有两种限定通配符
一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上界
另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界。泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。
另一方面<?>表示了非限定通配符,因为<?>可以用任意类型来替代。
List<? extends T>和List <? super T>之间有什么区别 ?
<? extends T> 通过确保类型必须是T的子类来设定类型的上界
<? super T>它通过确保类型必须是T的父类来设定类型的下界
这两个List的声明都是限定通配符的例子
List ? extends T>可以接受任何继承自T的类型的List,?
是 T的子类或者是T本身
而List<? super T>可以接受任何T的父类构成的List。
以上是关于JavaSE 语法基础--- 泛型(基础知识问答)的主要内容,如果未能解决你的问题,请参考以下文章