博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 泛型详解
阅读量:2056 次
发布时间:2019-04-28

本文共 3288 字,大约阅读时间需要 10 分钟。

一、泛型简介

【1】泛型的基本简介

泛型是JDK1.5的特性。

JDK1.7之后可以省略“=”右边泛型的具体类型

泛型使用’<大写字母>‘表示。

泛型可以用在类、接口、方法上

【2】泛型的特点

泛型可以将错误提前:由运行阶段提前到编译阶段

【3】泛型在源码中的表示

<E> :elements 元素

<T> : type 类型
<R> : result 结果
<K> : key 键
<V> : value 值

二、在接口上使用泛型

【1】泛型在接口和实现类中都没有实现

接口使用泛型就是在接口后面跟上<大写字母>

接口的实现类如果没有实现泛型,那么在实现类后面也要跟上<大写字母>

如果实现类中没有实现泛型,那么需要在创建对象时调用

public class GenericityDemo {	public static void main(String[] args) {//创建对象时,指明泛型类型		GenerImpl
gen = new GenerImpl<>(); }}interface Gener
{ T method();}class GenerImpl
implements Gener
{ @Override public T method() { return null; }}

【2】泛型在接口中没有确定,在接口的实现类中确定

接口的实现类如果确定了泛型,那么在创建对象时就没有必要确定泛型。

public class GenericityDemo2 {	public static void main(String[] args) {		GenerImpl2 gen = new GenerImpl2();	}}interface Gener2
{ T method();}class GenerImpl2 implements Gener2
{ @Override public String method() { return null; }}

当我指明泛型类型后,创建对象就不需要实现泛型了。

 

三、在类上使用泛型

在定义类时,在类名后加上<大写字母>

泛型擦除:就是决定泛型的具体类型

如果泛型有多个,在<>中用‘,’隔开

public class GenericityDemo3 {	public static void main(String[] args) {		GenerDemo3
demo = new GenerDemo3<>(1,"李四"); System.out.println(demo.getName()); System.out.println(demo.getNum()); System.out.println(demo); }}class GenerDemo3
{ private K num; private V name; public GenerDemo3(K num, V name) { this.num = num; this.name = name; } public K getNum() { return num; } public V getName() { return name; } @Override public String toString() { return "GenerDemo3 [num=" + num + ", name=" + name + "]"; }}

四、在方法上使用泛型

在方法的返回值类型前<大写字母>。在调用方法时确定泛型的类型。

public static void main(String[] args) {		String str = "hello,world";		String str1 = method(str);		System.out.println(str1);	}	public static 
V method(V v){ return v; }

在方法返回值之前加上"<大写字母>"

五、泛型的上下限

【1】泛型的下限: <? super 类或者接口>

表示传入的泛型最小范围是super后面的类/接口

传入的泛型如果是类/接口的父类/父接口即可。

public class GenericityDemo3 {	public static void main(String[] args) {		Object obj = "1001";		String str = "小明";		GenerDemo3 g3 = method(new GenerDemo3(obj,str));		System.out.println(g3);	}	public static  GenerDemo3
method(GenerDemo3
value){ return value; }}class GenerDemo3
{ private K num; private V name; public GenerDemo3(K num, V name) { this.num = num; this.name = name; } public K getNum() { return num; } public V getName() { return name; } @Override public String toString() { return "GenerDemo3 [num=" + num + ", name=" + name + "]"; }}

分析:在上面的方法中,我设置了String为下限。向GenerDemo3的构造方法中传入Object对象与String对象,返回GenerDemo3的一个对象值。

【2】泛型的上限: <? extends 类或者接口>

表示传入的泛型最大的范围是extends后面的类/接口

传入的泛型如果是类/接口的子类/子接口即可。

public class GenericityDemo4 {	public static void main(String[] args) {		Object obj = new Object();		String str = "小明";		GenerDemo4
g3 = new GenerDemo4<>(obj,str); g3 = method(g3); System.out.println(g3); } public static GenerDemo4
method(GenerDemo4
value){ return value; }}class GenerDemo4
{ private K num; private V name; public GenerDemo4(K num, V name) { this.num = num; this.name = name; } public K getNum() { return num; } public V getName() { return name; } @Override public String toString() { return "GenerDemo4 [num=" + num + ", name=" + name + "]"; }}

注意:泛型上限和下限不要同时存在一个<>中,因为Java中的类,是树状结构,一个类的父类子类,都在一条枝丫上。如果我们任意指定子类与父类,容易导致结构混乱。

转载地址:http://pddlf.baihongyu.com/

你可能感兴趣的文章
Runc 容器初始化和容器逃逸
查看>>
使用 GDB + Qemu 调试 Linux 内核
查看>>
介绍一个小工具:SSL-exporter
查看>>
深入理解 tc ebpf 的 direct-action (da) 模式(2020)
查看>>
为容器时代设计的高级 eBPF 内核特性(FOSDEM, 2021)
查看>>
Loki系列文章
查看>>
字节跳动面试官问:微服务下如何保证分布式事务的最终一致性?
查看>>
使用 Prometheus 监控 WireGuard
查看>>
BPF 可移植性和 CO-RE(一次编译,到处运行)
查看>>
万字长文:彻底搞懂容器镜像构建
查看>>
GitHub 又又又多了一个新主题 —— Dimmed Dark 主题!
查看>>
cgroup 挂载失败是什么鬼???
查看>>
深入 kubernetes API 的源码实现
查看>>
真香!使用 Goland 网页版实现真正的云开发
查看>>
又超时了!Etcd分布式锁你用明白了吗?
查看>>
工程师应该怎么学习
查看>>
记一次 Kubernetes 机器内核问题排查
查看>>
记一次 Kubernetes 中严重的安全问题
查看>>
在业务系统中寻找技术含量
查看>>
拥抱云原生,基于 eBPF 技术实现 Serverless 节点访问 K8S Service
查看>>