Java泛型、通配符、类型擦除、pecs
1、Java泛型
Java的泛型是JDK1.5时引入的。Java的泛型是伪泛型。
- 1.泛型类
在创建实例时,需要为其类型变量赋值
class A<T>{
}
- 2.泛型方法
class A<T>{
public T fun1(){}
public void fun2(T t){} //参数
//以上两个都不是泛型方法,他们是泛型类里面的一个方法
//发现方法要求需要在方法上有泛型的定义
public <T> T fun3(){}//此为泛型方法
}
class B{
public <T> fun1(){}//也为泛型方法,泛型方法不一定要在泛型类中
}
-
泛型方法和泛型类并没有直接的关系
-
3.泛型类的使用
*泛型类中定义的泛型
>可以在方法的返回值中使用
>可以在方法的参数中使用
>可以在局部变量是使用
class C<T>{
public T fun1(){ //返回值
T t = ...//可以的
new T()//不可以的,会报错
}
public void fun2(T t){} //方法的参数
}
- 4.泛型的继承和实现
*子类不是泛型类:需要给父类传递一个具体的类型常量
>此时父类中所有的泛型参数都会被此类型常量给替换掉
*子类是泛型类:可以给父类传递一个具体的类型参数,也传递一个泛型参数
class AA1 extends A<String>{}
class AA2<E> extends A<E>{}
2、Java泛型通配符?
通配符分类
具体的可以看 java 通配符解惑
? :无界通配
<? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”
<? super T>:是指 “下界通配符(Lower Bounds Wildcards)”
3、java泛型 类型擦除
Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉。
List<String>、List<T> 擦除后的类型为 List。
List<String>[]、List<T>[] 擦除后的类型为 List[]。
List<? extends E>、List<? super E> 擦除后的类型为 List<E>。
List<T extends Serialzable & Cloneable> 擦除后类型为 List<Serializable>。
4、pecs
Java 泛型中的PECS原则
生产者(Producer)使用extends,消费者(Consumer)使用super。
上界通配符 Plate<? extends Fruit> 覆盖下图中蓝色的区域。
上界<? extends T>不能往里存,只能往外取
下界Plate<? super Fruit>覆盖下图中红色的区域。
下界<? super T>不影响往里存,但往外取只能放在Object对象里
参考