泛型学习目录:
Java泛型-1(泛型的定义)
Java泛型-2(通配符)
Java泛型-3(实践篇-protostuff序列化与反序列化)
Java泛型-4(类型擦除后如何获取泛型参数)
请注意:泛型里面不能使用基本数据类型。例如Box<int>
泛型官网地址
1.1 泛型的作用
为啥用:编译期提供类型检查以及消除类型转换。
在哪用:泛型用在定义类、接口、方法处。
1.2 泛型参数命名规则
泛型参数
名称是单个大写字母。和您了解的变量命名规则不同。因为如果没有这种约定的话,就很难区分泛型参数
和普通类或接口的名称
。
- E-Element (Java Collection框架大量使用)
- K-Key
- N-Number
- T-Type (对象类型)
- V-Value
- S,U,V等 ( 第二,第三,第四个类型)
1.3 泛型类的定义
class name<T1,T2,...,Tn>
类型参数部分被一对尖括号(<>)
划分,他指定了类型参数
也叫类型变量,即T1,T2,...,Tn
。
泛型类代码实现:
在类上声明泛型,那么这个泛型类型可以在类中任意地方使用。
//这个T的类型,可以在任何地方使用
public class Box<T> {
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
我们引入的类型变量T
,可以在类中的任意地方使用。
类型变量可以指定为任意非原始类型的类型:任意的类,任意的接口,任意的数组甚至其他的类型变量。
当然泛型接口也是这样的原则。
泛型类可以有多个参数时:
//泛型接口
public interface Pair<K, V> {
public K getKey();
public V getValue();
}
public class OrderPair<K, V> implements Pair<K, V> {
private K key;
private V value;
public OrderPair(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
}
1.4 调用和实例化泛型类型
要是在代码中引用泛型类Box
,必须执行 泛型类型调用,把T
替换成具体的值。
Box<Integer> box=new Box<Interger>(); //此时T的类型就是传入的类型
泛型类型调用与普通方法调用类似,但不是将参数传递给方法,而是将类型参数传递给Box
类本身。
1.5 泛型方法
泛型方法中
泛型参数
作用域:仅限于声明它的方法。允许使用静态或者非静态的泛型方法,以及泛型构造函数。泛型方法的语法:若方法
返回类型
是泛型参数
,需要在方法返回值之前
,声明<泛型类型>
的格式。
泛型声明的反例:
异常原因: Cannot resolve symbol 'T'【无法解析符号T】
泛型声明的正例:
方法返回值前的<T>就是为了告诉编译器,当前的方法的泛型类型可以和类的泛型类型不一致。