簡體   English   中英

如何在Java子類中引用父類的泛型類型?

[英]How to refer the generic type of super class in subclass in Java?

我有以下基礎課

class Base<T> {
    // ...
}

我有這個課來擴展基礎

class Derived extends Base<String> {
    public void doSomething(String param) { // this works

    }

    public void doSomething(Base::T param) { // this DOES NOT work

    }
}

我想知道是否有一個Java技巧可以在不直接使用具體的String類的情況下使第二個函數定義起作用?

是的,我有理由。 有許多類需要用不同的具體類型擴展Base。 我想避免在每個類中更改功能簽名,如果可能的話,應該避免這樣做。

如果您有許多需要擴展Base<T>類的類,並且它們都具有doSomething方法,則應該將doSomething放在Base<T>

class Base<T> {
    public void doSomething(T param) {} // or even make this abstract
}

然后,像IntelliJ IDEA這樣的IDE可以為您生成重寫的方法。 當您開始輸入方法名稱時,將彈出:

在此處輸入圖片說明

您按Enter,然后將為您生成。

@Override
public void doSomething(String param) {
    super.doSomething(param);
}

我懷疑您可能正在復制並粘貼doSomething的實現,因為否則為什么您認為更改每個實現的參數類型很煩人?

如果實現基本相同,請考慮在Base<T>中使用doSomething方法,然后將不同的部分提取到doSomethingImpl方法中,該方法將被派生類覆蓋。

為了將不同的參數傳遞給您的方法,您可以實現一個上限類型參數。

class Derived<T extends Foo> extends Base<Foo> {
   public void doSomething(Foo param) { // this works

   }
}

public <T extends Foo> void doSomething(List<T> foos) {}
public void doSomething(List<Foo> foo) {}

鑒於: class Bar extends Foo { }

List<Bar> list = new ArrayList<Bar>();
doSomething(list);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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