2016-11-06 28 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对象,以便您可以访问其(可见)成员。