Java泛型类扩展泛型参数

3

简短版:

如何正确使用语法使类继承其泛型参数:

 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 */ }
}

问题在于Gi的代码将会被重复多次。

我想要实现的解决方案是将所有GFi重新分组到一个通用类中。

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

那么如何在Java中实现呢?如果不可能,有什么好的方式可以实现呢?

很遗憾,看起来你想要在Java中使用多重继承,但这是不被支持的。建议你考虑使用mixin策略。 - pathfinderelite
1个回答

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);
}

然后您有类 F1F2G1G2,它们包含各种方法实现。您传递一个 Foo 对象,以便可以访问其(可见的)成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接