[英]java generic class extends the generic argument
簡潔版本:
使類擴展其泛型參數的正確語法是什么:
class A<T> extends T {} // doesn't compile
長版:
我有一個基本抽象類(以下代碼已縮短,僅用於此帖子目的)
abstract class D {
abstract void f();
abstract void g();
}
然后,每個f()和每個g()都有一組可能的組合。 目標是擁有所有可能的組合。
一種解決方案是為每個f_j()創建一個擴展D的類Fj並實現f_j(),然后對於每個g_i(),我們創建一個擴展Fj並實現g_i()的類GiFj。 例如
abstract class F1 extends D {
@Override
void f() { /* F1 Work */ }
}
abstract class F2 extends D {
@Override
void f() { /* F2 Work */ }
}
class G1F1 extends F1 {
@Override
void g() { /* G1 Work */ }
}
class G1F2 extends F2 {
@Override
void g() { /* G1 Work : Duplicated Code */ }
}
問題是Gi的代碼會多次重復。
我想要實現的解決方案是將所有GFi重組為泛型類
class G1<F extends D> extends F {
@Override
void g() { /* G1 work */ }
}
那么如何在java中做到這一點,或者如果不可能做到這一點的好方法
回答短版本
這在Java中是不可能的。 編譯器需要在編譯時知道類的超類具有哪些方法和字段。 因此,類只能擴展具體類(可能使用類型變量),但它不能自己擴展類型變量。
回答長版本(表面上似乎與短版本無關)
您可以使用合成來實現您想要的類型:
class Foo {
final FDelegate fDelegate;
final GDelegate gDelegate;
Foo(FDelegate fDelegate, Delegate gDelegate) {
this.fDelegate = fDelegate;
this.gDelegate = gDelegate;
}
void f() {
fDelegate.f(this);
}
void g() {
gDelegate.g(this);
}
}
interface FDelegate {
void f(Foo container);
}
interface GDelegate {
void g(Foo container);
}
然后你有F1
, F2
, G1
, G2
類,它們包含各種方法實現。 您傳遞一個Foo
對象,以便您可以訪問其(可見)成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.