上篇文章介绍了泛型接口,这篇我们继续介绍泛型类
泛型类声明
泛型类的声明方式跟泛型接口类似,在类名称后面的尖括号中声明泛型参数.可以指定一个或多个参数,参数之间用逗号隔开
public class ClassExample1<T> {
public void method1(String input){
System.out.println(input);
}
protected T getT(T input){
System.out.println(input.toString());
return (T)input;
}
}
在类方法中,可以根据需要选择是否使用泛型参数,public void method1(String input)就没有使用泛型参数,而protected T getT(T input)的参数和返回值都是用了泛型参数.
泛型类继承
泛型类也跟普通类一样可被继承,继承时也可以根据需要来选择是否指定父类的泛型参数
指定泛型参数
public class SubClass1 extends ClassExample1<Number> {
@Override
protected Integer getT(Number input){
return (Integer)input;
}
public Number getT(Integer input){
return input;
}
}
SubClass1在继承ClassExample1时指定了参数为Number.
通过
getT方法可以看出,子类重写父类方法时,方法返回值可以是父类方法返回值的子类型
不指定泛型参数
public class SubClass2 extends ClassExample1 {
@Override
protected Integer getT(Object input){
return (Integer)input;
}
public static void main(String[] args) {
ClassExample1 parent = new SubClass2();
System.out.println(parent.getT(123));
}
}
SubClass2没有指定父类的泛型参数,那么泛型参数会被替换成Object
调用方法时指定
或者你可以推迟到调用父类的方式时指定具体类型,比如
public class SubClass3 extends ClassExample1 {
public static void main(String[] args) {
ClassExample1<Integer> classExample1 = new SubClass3();
classExample1.getT(123);
}
}
总结
- 声明泛型类时,可以指定一个或多个泛型参数,参数之间用逗号隔开
- 继承泛型类时,可以选择是否指定父类的泛型参数
- 如果继承时没有指定,那么参数会被替换成
Object