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