一,泛型的由来:
早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
二,泛型概述
泛型,即“参数化类型”;顾名思义,就是将类型由原来的具体的类型(引用数据类型)参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
三,泛型使用注意事项:
<>中放的必须是引用数据类型
前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
例如:ArrayList<String> list = new ArrayList(); 如果后面的也写上那就必须前后一致:ArrayList<String> list= new ArrayList<String>();
四,泛型好处
提高安全性(将运行期的错误转换到编译期)
//这段代码在编译器不会报错,但是在运行期间会抛ClassCastException;
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc");
list.add(true);
list.add(1233);
for (int i =0; i<list.size();i++) {
String s = (String) list.get(i);
System.out.println(s);
}
}
省去强转的麻烦
五,泛型基本使用
5.1,泛型类的概述及使用
泛型类概述<T>
把泛型定义在类上
定义格式
public class 类名<泛型类型1,…>
注意事项
泛型类型必须是引用类型
简单的泛型类
public class Tool<E> {//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
private E key;
public E getKey() {
return key;
}
public void setKey(E key) {
this.key = key;
}
}
5.2,泛型方法的概述和使用
泛型方法概述
把泛型定义在方法上
定义格式
public <泛型类型> 返回类型 方法名(泛型类型 变量名)
非静态泛型方法的使用
public class Tool<E> {//此处E可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
private E key;
public E getKey() {
return key;
}
public void setKey(E key) {
this.key = key;
}
//泛型方法 类泛型使用的是E 泛型方法使用的是T
public<T> void show(T t) { //方法泛型最好与类的泛型一致
System.out.println(t); //如果不一致,需要在方法上声明该泛型
}
}
静态泛型方法的使用
public class Tool<E> {//此处E可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
private E key;
public E getKey() {
return key;
}
public void setKey(E key) {
this.key = key;
}
//泛型方法 类泛型使用的是E 泛型方法使用的是T
public<T> void show(T t) { //方法泛型最好与类的泛型一致
System.out.println(t); //如果不一致,需要在方法上声明该泛型
}
public static<W> void print(W w) { //静态方法必须声明自己的泛型
System.out.println(w);
}
}
5.3,泛型接口的概述和使用
泛型接口概述
把泛型定义在接口上
定义格式
public interface 接口名<泛型类型>
泛型接口的使用
//泛型接口
interface Inter<T> {
public void show(T t);
}
//泛型接口的使用1
class Demo implements Inter<String> { //推荐用这种
@Override
public void show(String t) {
System.out.println(t);
}
}
//泛型接口的使用2
class Demo<T> implements Inter<T> { //没有必要在实现接口的时候给自己类加泛型
@Override
public void show(T t) {
System.out.println(t);
}
}
5.4,泛型高级之通配符
泛型通配符<?>
任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E
向下限定,E及其子类
? super E
向上限定,E及其父类
好文章分享