簡體   English   中英

在Java中使用泛型進行繼承

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM