泛型类派生子类

泛型类派生子类

练习:
1.写一个泛型父类Parent,里面有一个私有字段,以及它的读写器
2.写一个泛型子类ChildFirst继承Parent,重写Parent中的方法

  • 当父类不加泛型标识时,默认是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,重写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);
    }
}