是否可以在Java中扩展泛型类参数?

时间:2009-08-11 06:53:18

标签: java generics multiple-inheritance

这样的事情在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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您尝试做的事情不会起作用 - Java泛型与继承无关。没有多重继承,你必须与之保持平静: - )

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

答案 2 :(得分: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中将继承更多的操作,这个例子中没有显示。

答案 3 :(得分:0)

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

尝试在不支持它的语言中提出多重继承的解决方案,这可能是该缺陷在设计中的一个很好的指标。说A<T extends B> extends T显然会失败,因为它甚至不代表您希望它的意思 - <T extends B>仅表示T属于的类型em> B。追加extends T并不意味着什么,因为该类中未定义T。同样,这是一个编译时类型 - 在运行时期间,T的实际类型不能直接使用。

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

更具体的例子可能允许其他人对设计本身给予更多反馈。