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。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RAIN 7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值