泛型類派生子類

CH0701發表於2021-08-14

泛型類派生子類

練習:
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);
    }
}

相關文章