泛型
集合类的抽象数据类型的一个关键特性是我们应该可以用它们存储任意类型的数据。一种特别的Java机制可以做到这一点,它就是泛型。泛型也被称为“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。在每份API中,类名后的记号将E定义为一个类型参数,它一个象征性的占位符,表示的是用例将会使用的某种具体数据类型。
例如:public class ArrayStack<E> implements Stack<E>{}
在实现Stack时,我们并不知道E的具体类型,但是用例可以用我们的栈处理任意类型的数据,甚至是在我们的实现之后才出现的数据类型。在创建栈时,用例会提供一种具体的数据类型。我们可以将E替换为任意引用数据类型( E出现的每个地方都是如此)。
一些常用的泛型类型变量:
E:元素(Element)
K:关键字(Key)
N:数字(Number)
T:类型(Type)
V:值(Value)
使用泛型的意义在于:
1,适用于多种数据类型执行相同的代码(代码复用)
2, 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
泛型的使用方式分别为泛型类、泛型接口、泛型方法
泛型类:是在实例化类的时候指明泛型的具体类型;
泛型方法:是在调用方法的时候指明泛型的具体类型 。
泛型类的使用
定义一个泛型类:public class GenericClass{}
泛型类定义时只需要在类名后面加上类型参数即可,当然你也可以添加多个参数,类似于<K,V>,<T,E,K>等。这样我们就可以在类里面使用定义的类型参数。
泛型接口的使用
定义一个泛型接口:public interface GenericIntercace<T>{}
实现泛型接口方式:public class ArrayStack<E> implements Stack<E>{}
泛型方法的使用
前面我们介绍的泛型是作用于整个类的,现在我们来介绍泛型方法。泛型方法既可以存在于泛型类中,也可以存在于普通的类中。如果使用泛型方法可以解决问题,那么应该尽量使用泛型方法。下面我们通过例子来看一下泛型方法的使用:
泛型中需要注意的问题
1、不能实例化泛型类
2、静态变量或方法不能引用泛型类型变量,但是静态泛型方法是可以的
3、基本类型无法作为泛型类型
4、无法使用instanceof关键字或==判断泛型类的类型
5、泛型类的原生类型与所传递的泛型无关,无论传递什么类型,原生类是一样的
6、泛型数组可以声明但无法实例化
7、泛型类不能继承Exception或者Throwable
8、不能捕获泛型类型限定的异常但可以将泛型限定的异常抛出
来源:CSDN
作者:fs站在远方看童年
链接:https://blog.csdn.net/weixin_45160969/article/details/103570188