泛型
指定参数化类型
泛型的类型擦除
泛型只在编译阶段有效,泛型类型在逻辑上可看成是多个不同的类型,但是其实质都是同一个数据类型。
编译之后程序会采取去泛型化的措施。
泛型通配符
无边界通配符
<?>
上边界通配符
<? extends XXX>必须是XXX及其子类
下边界通配符
<? super XXX>必须是XXX及其父类
泛型的使用
泛型跟我们的成员属性一样,必须先声明在使用,泛型的声明采用 <> 进行声明。
声明泛型一般约定采用单个大写字母表示,常用的有 K E T V 等。
使用泛型可以增加代码的灵活度。
泛型类
在类中使用泛型
public class Person<T> {
private T cal;
public Person(T cal){
this.cal =cal;
}
}
Person<String> p = new Person("str");
Person<Integer> p = new Person(7);
泛型方法
实体方法
实体方法可以使用在类中定义的泛型或者方法中定义的泛型。
public class Person<T> {
private T cal;
//使用类型定义的泛型
public Person(T cal){
this.cal =cal;
}
//使用方法中定义的泛型
public <K> K mothod1(E e,V v){
return K;
}
}
静态方法
不可以使用在类中定义的泛型,只能使用在静态方法上定义的泛型。
public static <K> K mothod1(E e,V v){
return null;
}
泛型接口
在接口的定义时进行泛型的声明。
接口是标准的指定者,指实现该接口的类必须实现其标准定义(即抽象方法)。所以在接口上进行泛型的申明,或者说使用泛型接口,可以让我们的程序代码更加简洁,更加多变.
public interfice CalGeneric<T>{
T add(T a,T b) ;
}
public class CalIntegerGeneric implements CalGeneric<Integer>{
@Override
public Integer add(Integer a,Integer b){
return null;
}
}