[英]Inheritance using Generics in Java
class A<E>{
}
class B<E> extends A{
}
public class WildInDeclare<E>{
public static void main(String[] args){
A<Integer> obj = new B<Integer>();
}
}
當我編譯以上程序時,出現此錯誤。
Note: WildInDeclare.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
之后,我只將class B<E> extends A{
替換為class B<E> extends A<E>{
它工作正常,您能解釋一下為什么在代碼繼承過程中需要再次編寫A<E>
嗎?
我面臨的第二個繼承問題。 我用以下代碼更新上面的代碼。
class A<E>{
public A(E o){
}
}
class B<E> extends A{
public B(){
super(E);
}
}
public class WildInDeclare<E>{
public static void main(String[] args){
A<Integer> obj = new B<Integer>();
}
}
但是為什么不編譯呢? 我收到以下錯誤。
WildInDeclare.java:8: error: cannot find symbol
super(E);
^
symbol: variable E
location: class B<E>
where E is a type-variable:
E extends Object declared in class B
Note: WildInDeclare.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
如何將Parameter傳遞給Parent類?
您能解釋一下為什么需要再次寫A嗎
因為A
是采用一個類型參數的泛型類。 理想情況下,您將不能引用原始類型A
,而只能引用A<String>
或A<Integer>
或A<Map<K, List<O>>
等。Java讓您使用原始類型是為了向后兼容,但原則上必須提供該參數。
當您說類B
擴展了A
,您仍然需要說它擴展了什么類型的A
即通用參數是什么。 (這並不需要是相同的B
的泛型參數-例如,你可以定義B<E> extends A<String>
,這將是一致的。)
以下代碼...未編譯。 為什么?
該代碼在語法上是無效的。 您已定義A
的構造函數以采用其通用參數類型的對象 。 因此,當您從B
的構造函數調用super()
,您需要傳遞此類對象。 E
不是對象-它只是B泛型參數的名稱。 因此,編譯器正確地說“找不到符號”,在范圍內沒有所謂的E
如果您希望B
接受一個只是傳遞給超類構造函數的輸入參數,它將看起來像這樣:
class B<E> extends A<E> {
public B(E e) { // this parameter could be called anything, doesn't have to be e
super(e);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.