泛型類派生子類
練習:
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);
}
}