范型的继承
子类继承父类结果:
- 保持子类的范型化
- 子类不再范型化
一般的范型继承
范型父类:
public class FatherFoo <T, E> {
private T t;
private E e;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public E getE() {
return e;
}
public void setE(E e) {
this.e = e;
}
}
子类继续范型化
// 子类中的 T,E 继承了父类中的T, E的范型类型
// 而 范型类型 F是子类自己添加的
public class SubFoo<F, T , E> extends FatherFoo<T, E> {
private F f;
public void setF(F f) {
this.f = f;
}
@Override
public void setT(T t) {
super.setT(t);
}
@Override
public void setE(E e) {
super.setE(e);
}
}
子类不再范型化
1.指定具体的范型类型,重写之后的方法中的类型随着父类指定的类型:
public class SecFoo extends FatherFoo <String, Integer> {
@Override
public void setT(String s) {
super.setT(s);
}
@Override
public void setE(Integer integer) {
super.setE(integer);
}
}
2.没有指定具体的范型类型,默认是Object类型(因为类型被擦除):
public class SecFoo extends FatherFoo {
@Override
public void setT(Object o) {
super.setT(o);
}
@Override
public void setE(Object o) {
super.setE(o);
}
}
有界的范型的继承
范型父类:
public class FatherTan<T extends Road> {
private T t;
public void setT(T t) {
this.t = t;
}
}
子类继续范型化
// T 继承了父类中的 T 类型,所以要在子类中约束
public class SubTan<E extends Tree, T extends Road> extends FatherTan<T>{
@Override
public void setT(T t) {
super.setT(t);
}
}
// 不能写成以下方式,编译会报错!!!
public class SubTan<E extends Tree, T> extends FatherTan<T extends Road>{
}
子类不再范型化
1.指定具体的范型类型,重写之后的方法中的类型随着父类指定的类型,指定的类型必须是Road类的子类型:
public class SecTan extends FatherTan<SecondRoad> {
@Override
public void setT(SecondRoad secondRoad) {
super.setT(secondRoad);
}
}
2.没有指定具体的范型类型,这里默认是Road类型:
public class SecTan extends FatherTan {
@Override
public void setT(Road road) {
super.setT(road);
}
}