2016-11-06 108 views
3

短版:Java的泛型類擴展了通用的說法

什麼是正確的語法,使一個類繼承它的通用說法:

class A<T> extends T {} // doesn't compile 

龍版本:

我有一個抽象基類(下面的代碼已經縮短了這個職位的用途)

abstract class D { 
    abstract void f(); 
    abstract void g(); 
} 

然後,每個f()和每個g()都有一組可能的組合。目標是擁有所有可能的組合。一個解決方案是爲每個f_j()創建一個擴展D並實現f_j()的類Fj,然後爲每個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 */ } 
} 

的問題是,對於胃腸道的代碼是會得到重複多次。

,我想要實現的解決方案是將所有GFI重新集結成泛型類

class G1<F extends D> extends F { 
    @Override 
    void g() { /* G1 work */ } 
} 

因此,如何在Java中做到這一點,或者如果它是不可能有什麼做

的好辦法
+0

不幸的是,它看起來像你想要多類繼承,這在Java中不受支持。看看使用[mixin](http://stackoverflow.com/questions/587458/implement-mixin-in-java)策略。 – pathfinderelite

回答

1

對短文本的解答

這在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,F2G1,G2。您傳遞Foo對象,以便您可以訪問其(可見)成員。