1

这样的事情在 Java 中是否有意义?

class A<T extends B> extends T{ 
  int fun1() {
    ....
  }      
}

abstract class B extends X implements C {

}

interface C {
  int fun1();
}

我希望 B 类理想地扩展 X 和 C。但由于 Java 中没有多重继承,我试图想出一个更巧妙的解决方法。

诀窍在于,将在 C 中定义的东西是在超类“A”中定义的。问题是让 A 让我在“扩展”之后使用泛型类型

想法?

4

4 回答 4

4

不,您不能使类型扩展指定为类型参数的类

在不知道 A、B、C 或 X 是什么的情况下,恐怕很难推荐一种替代设计模式。

于 2009-08-11T06:55:47.833 回答
2

您尝试做的事情是行不通的——Java 泛型与继承无关。没有多重继承,你必须接受它:-)

您可以声明多个接口并使用聚合来“伪造”多重继承。

于 2009-08-11T06:57:21.793 回答
1

正如其他人所说,泛型不会帮助您实现实现的多重继承。

由于多重继承,我不重复自己的解决方法通常是在超类的静态方法中编写通用实现,并从需要的地方委托给它。

最简单的例子是这样的:

class A
{
}

class B extends A 
{
}

interface C
{
    void foo();
}

class CBase extends A implements C
{
    public void foo()
    {
        sFoo(this);
    }

    static void sFoo(C c)
    {
        // Implement foo here
    }
}

class D extends B implements C
{
    public void foo()
    {
        CBase.sFoo(this);
    }
}

请注意,为了使其有用,D 将从 B 和 A 继承更多操作,本示例中未显示这些操作。

于 2009-08-11T08:37:47.457 回答
0

类型参数只是编译时泛型的占位符,它是实际类型。

尝试用一种不支持多重继承的语言来解决多重继承问题,这可能是设计中存在缺陷的一个很好的指标。说A<T extends B> extends T显然会失败,因为它甚至不意味着你希望它意味着什么 -<T extends B>只意味着T是一个 B. 附加extends T没有任何意义,因为T没有在该类中定义。同样,这是一个编译时类型 - T 的实际类型在运行时不直接可用。

您真的确定通过多重继承而不是组合最能正确地实现什么?也可能是你试图A做太多的事情。

一个更具体的例子可能允许其他人对设计本身提供更多反馈。

于 2009-08-11T08:04:36.507 回答