- 泛型:实现了编写一次,万能匹配,又通过编译器保证了类型安全。
- 泛型最大的好处:可以提高代码的复用性。 以List接口为例,我们可以将String、 Integer等类型放在List中, 如不用泛型, 存放String类型要写个List接口, 存放Integer要写另外一个List接口, 泛型可以很好的解决这个问题。
- Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。 类型擦除可以简单的理解为将泛型java代码转换为普通java代码。
- Java采用Code sharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。
- 类型擦除的主要过程如下: 1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。2.移除所有的类型参数。
下面是泛型方法的定义
* 参数T
* 第一个 表示是泛型
* 第二个 表示返回的是T类型的数据
* 第三个 限制参数类型为T
[public] [static] <T> T getListFisrt(List<T> data)
说明:使用泛型方法时,至少返回值或参数有一个是泛型定义的
编写泛型类型
泛型还可以定义多种类型。例如,我们希望Pair不总是存储两个类型一样的对象,就可以声明类型<T, K>:
public class Pair<T, K> {
private T first;
private K last;
public Pair(T first, K last) {
this.first = first;
this.last = last;
}
public T getFirst() { ... }
public K getLast() { ... }
}
使用的时候,需要指出两种类型:
Pair<String, Integer> p = new Pair<>("test", 123);
Java标准库的Map<K, V>就是使用两种泛型类型的例子。它对Key使用一种类型,对Value使用另一种类型
/**
* 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
*/
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
- extends通配符
作用:对泛型类实例的类型做限制(向下限制)。
使用类似<? extends Number>通配符作为方法参数时表示:
1.方法内部可以调用获取Number引用的方法,例如:
Number n = obj.getFirst();
2.方法内部无法调用传入Number引用的方法(null除外),例如:
obj.setFirst(Number n);
一句话总结:使用extends通配符表示可以读,不能写。
- super通配符
作用:对泛型类实例的类型做限制(向上限制)。
使用<? super Integer>通配符表示:
1.允许调用set(? super Integer)方法传入Integer的引用;
2.不允许调用get()方法获得Integer的引用。
唯一例外是可以获取Object的引用:
Object o = p.getFirst();
换句话说,使用<? super Integer>通配符作为方法参数,表示方法内部代码对于参数只能写,不能读。










网友评论