2022-04-15 21:23

最新Java程序员经典面试题大全(四) — 泛型

王姐姐

JavaEE

(1054)

(0)

收藏

1、泛型的定义及为什么要使用泛型

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

引入泛型的原因:可以增强代码的复用性,当然这种限定死类型的方式也会使得代码的安全性和可读性更高。

2、定义一个简单的泛型类

在这里插入图片描述

泛型类型和普通类型的区别主要在于:类名之后多了个,并且实例域类型可以不是具体的类型而是不确定的T类型。

使用具体的类型来替换类型变量的过程我们叫做实例化泛型类型。例如:Pair,等。这其中需要注意的是**:java中的9中基本类型是不能作为类型变量的**,也就是:Pair,是会不允许的。当然,声明一个泛型类时,不局限于一个类型变量,可以由多个类型变量。

在这里插入图片描述

3、定义一个简单的泛型方法

在这里插入图片描述

泛型类中可以声明泛型方法也可以声明普通方法,泛型方法可以出现在泛型类中也可以出现在普通类中,也就是它们之间并没有什么约束关系。

4、类型参数的限定

我们知道,如果想要使用compareTo方法,就要实现Comparable接口,赫继承实现了此接口的

类。此处想要使得程i?正确,有两种办法。第一种:使类继承Comparable接口并且实现compareTo方

法。第二种:就是使用类型变量限定。如下:

在这里插入图片描述

原来的T可以是任意类型的,而现在的T被限制必须实现了Comparable 接口,就是说,凡是使用此泛型的类都是直接或者间接继承了Comparable 接口并实现其中方法的

5、泛型擦除

Java中的泛型基本上都是在编译器这个层次来实现的,在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除,如在代码中定义的List<Object#[] List等类型,在编译之后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。这个具体类一般是Object。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换成具体的类。

6、泛型通配符

1.<? extends T>表示该通配符所代表的类型是T类型的子类

2.<? super T>表示该通配符所代表的类型是T类型的父类

在这里插入图片描述

上界类型通配符(? extends)

语句1:List<? extends Number>eList存放Number及其子类的对象,语句1 取出Number (或者Number子类)对象直接赋值给Number类型的变量是符合java规范的。

语句2:List<? extends Number>eList存放Number及其子类的对象,语句2取出Number (或者Number子类)对象直接赋值给nteger类型(Number子类)的变量是不符合java规范的。

语句3: List<? extends NUniber>eList不能够确定实例化对象的具体类型,因此无法add具体对象至列表中,可能的实例化对象如下。

总结:上届类型通配符add方法受限,但可以获取列表中的各种类型数据,并赋值给父类型的引用,因此如果想从一个数据类型里获取数据,使用?extends通配符,限定通配符总是包括自己

下界类型通配符(? super)

在这里插入图片描述

语句1: List<? super Integer>无法踊定sList中存放的对象的具体类型,因此sList.get获取的值存在不确定性,子类对象的引用无法赋值给兄弟类的引用,父类对象的引用无法赋值给子类的引用,因此语句错误。

语句2:同语句1。

语句3:子类对象的引用可以赋值给父类对象的引用,因此语句正确。

总结:下界类型通配符get方法受限,但可以往列表中添加各种数据类型的对象。因此如果你想把对象写入一个数据结构里,使用? super通配符。限定通配符总是包括自己。

总结

限定通配符总是包括自己

上界类型通配符:add方法受限

下界类型通配符:get方法受限

如果你想从一个数据类型里获取数据,使用? extends通配符

如果你想把对象写入一个数据结构里,使用? super通配符

如果你既想存,又想取,那就别用通配符

不能同时声明泛型通配符上界和下界

为什么不允许泛型数组

在这里插入图片描述

Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。所以由于类型擦除的原因,Java是禁止直接创建泛型数组实例的。

————————————————

版权声明:本文为CSDN博主「littleAsuna」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/baidu_26954625/article/details/90600027

0条评论

点击登录参与评论