【问题标题】:java generic class extends the generic argumentjava泛型类扩展了泛型参数
【发布时间】:2016-11-06 15:46:10
【问题描述】:

短版:

使类扩展其泛型参数的正确语法是什么:

 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 策略。

标签: java templates generics


【解决方案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、F2、G1、G2,其中包含各种方法实现。您传递一个Foo 对象,以便您可以访问它的(可见)成员。

【讨论】:

    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    相关资源
    最近更新 更多