Java 基础之泛型(二)

209 阅读1分钟

上篇文章介绍了泛型接口,这篇我们继续介绍泛型类

泛型类声明

泛型类的声明方式跟泛型接口类似,在类名称后面的尖括号中声明泛型参数.可以指定一个或多个参数,参数之间用逗号隔开

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