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 语法基础--- 泛型(基础知识问答)的主要内容,如果未能解决你的问题,请参考以下文章

《JavaSE 基础知识》泛型的基本介绍和应用。

JavaSE必备知识(专栏目录)

JavaSe基本知识

JavaSE基础八----<集合>泛型集合体系Collection接口中的方法

java从基础知识泛型

Java基础之泛型