您的位置 首页 java

深入理解Java泛型机制——详解泛型的日常应用有哪些?

泛型的日常应用有:泛型类、泛型普通方法、泛型静态方法、泛型接口、泛型擦除模式、泛型通配符、泛型上下边界。

1. 泛型类

泛型类型用于类的定义中,被称为泛型类。最典型应用的就是各种容器类,如:List、Set、Map等。

泛型类的基本写法:

一个普通的泛型类(案例中泛型属性可以正常生成get set方法):

(main方法测试前,请先生成属性对应的get set方法)

演示效果(部分展示)

2. 泛型普通方法

泛型在定义普通泛型方法的时候,可以使用泛型类定义的泛型类型(本案例),也可以在普通方法中定义这个方法自己需要的特定泛型类型(参照下面的泛型静态方法定义自定义泛型方法中使用到的泛型类型)

main方法测试代码:

控制台效果:

3. 泛型静态方法

泛型静态方法中必须要声明本个方法中使用的泛型类型(<W>),泛型类和泛型静态方法没有任何关系,泛型类是针对对象的,泛型静态方法针对于是整个类,所以为了避免混淆,建议泛型类声明的泛型类型(T)和泛型静态方法中声明的泛型类型(W)使用不同的字符来表示。

以下是无返回值的泛型静态方法:

main方法测试:

有返回值泛型静态方法:

main方法测试:

控制台运行效果:

4.泛型接口

泛型接口与泛型类的定义及使用基本相同。

泛型接口的实现类,可以指定具体的泛型接口的具体泛型的类型。

泛型接口

泛型接口实现类(实现泛型接口中的泛型类型)

main方法测试:

控制台演示效果:

泛型接口的实现,如果没有指定具体的泛型类型,必须要在这个实现类中声明一个泛型类型占位符给接口用。

泛型接口实现类(没有实现泛型接口中的泛型类型)

main方法测试:

控制台效果:

5.泛型的擦除模式

Java中的泛型实际是伪泛型,在代码编译期间有泛型做限制,但在代码运行期间,会将所有的泛型全部擦除掉。所以无论使用什么样不同类型的泛型,结果其class对象都是一致的

使用不同类型的泛型,比较其class文件,发现是相等的,证明泛型在运行期间被擦除

运行结果:

为什么要使用擦除模式?

为了兼容JDK老版本的编码。

6.泛型通配符

Java中的继承并不是泛型中的继承。也就是说Java中的父子关系,在泛型中并不是父子关系

针对于上面的show方法进行以下测试,分别定义两个不同类型泛型的类型,分别调用show方法,我们会发现p.show(p)正常执行,但是p.show(p1)无法执行,编译报错,由此证明Java中Number是Integer的父类,但是在泛型中,泛型并不知道Number是Integer的父类

通配符:由于java中的继承关系,在泛型中不做任何声明修饰的情况下,是不被认可的,所以要使用通配符进行处理。接下来会使用通配符在泛型中将java中的继承关系重新绑定。

通配符一般使用?来表示,可以理解为?在泛型中所有类的父类。

使用通配符后代码正常编译执行:

演示效果:

7. 泛型上下边界

上面在泛型中的继承问题,通过使用通配符就可以很好的解决掉,但是我们会发现如果只使用通配符这个泛型的绑定没有任何意义,因为使用通配符就意味着所有的类型都可以注入进来,所以为了解决这个问题,泛型引入了上边界和下边界。

Extends(上边界)和super(下边界)关键字

上边界使用:

在读取T这个类型数据的时候,但不写入数据的时候,使用上边界

测试代码:

效果演示:

下边界使用:

需要写入数据的时候,但不需要读取的时候

测试代码:

写了这么多,如果大家还有不明白的地方,可以关注我,私信我。

看完记得点赞收藏,感谢支持。

文章来源:智云一二三科技

文章标题:深入理解Java泛型机制——详解泛型的日常应用有哪些?

文章地址:https://www.zhihuclub.com/182159.shtml

关于作者: 智云科技

热门文章

网站地图