泛型类派生子类
泛型类派生子类
练习:
1.写一个泛型父类Parent
2.写一个泛型子类ChildFirst
- 当父类不加泛型标识
时,默认是Object类型(此时会存在问题:1.子类重写父类的方法是Object类型,而不是泛型,所以在生成子类对象时,哪怕定义为Integer类型的对象,实际任然可以传入其他类型的值。2.编译器对1产生的问题不报警)
package generics.genericsextendson;
public class ChildFirst<T> extends Parent {
@Override
public Object getValue() {
return super.getValue();
}
}
package generics.genericsextendson;
public class Test {
public static void main(String[] args) {
ChildFirst<Integer> child = new ChildFirst<>();
child.setValue("childfirst");
System.out.println(child.getValue());
}
}
- 创建子类对象时,会去先调用父类的构造函数(不会创建一个父类对象),所以子类的泛型标识要与父类一致
- 子类可以进行泛型扩展ChildFirst<T,E>,子类中一定有一个泛型标识要与父类的一致
3.写一个泛型子类ChildSecond继承Parent
- 此时子类不是泛型类,父类要明确数据类型T,且不能为基本类型(任何用作泛型的东西都必须可转换为Object,而基本类型类型则不行,因此它们不能用于泛型。)
- 此时的ChildSecond做普通类使用
package generics.genericsextendson;
public class Test {
public static void main(String[] args) {
ChildFirst<String> child = new ChildFirst<>();
child.setValue("childfirst");
System.out.println(child.getValue());
System.out.println("-----------------------------------");
ChildSecond child2 = new ChildSecond();
child2.setValue(20);
System.out.println(child2.getValue());
}
}
Parent:
package generics.genericsextendson;
public class Parent<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
ChildFirst
package generics.genericsextendson;
public class ChildFirst<E> extends Parent<E> {
@Override
public E getValue() {
return super.getValue();
}
@Override
public void setValue(E value) {
super.setValue(value);
}
}
ChildSecond:
package generics.genericsextendson;
public class ChildSecond extends Parent<Integer> {
@Override
public Integer getValue() {
return super.getValue();
}
@Override
public void setValue(Integer value) {
super.setValue(value);
}
}