【问题标题】:Is it possible to extend a generic class parameter in Java?是否可以在 Java 中扩展泛型类参数?
【发布时间】:2009-08-11 06:53:18
【问题描述】:

这样的事情在 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 在“扩展”之后使用泛型类型

想法?

【问题讨论】:

  • 您能否详细描述您遇到的真正问题。我从来没有遇到过我真正需要多重继承的情况。这可能是一个设计问题,可以通过不同的方式解决。您的解决方案似乎变得相当复杂。
  • 我还要补充一点,这种类的“模板化”在 java 中不像在 C++ 中那样工作。

标签: java generics multiple-inheritance


【解决方案1】:

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

如果不知道 A、B、C 或 X 是什么,恐怕很难推荐另一种设计模式。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      最简单的例子是这样的:

      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 继承更多操作,这些操作未在此示例中显示。

      【讨论】:

        【解决方案4】:

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

        试图用一种不支持多重继承的语言提出一个解决方案,这可能是设计中存在缺陷的一个很好的指标。说A&lt;T extends B&gt; extends T 显然会失败,因为它甚至并不意味着你希望它的意思-&lt;T extends B&gt; 仅表示T 是一种B 的类型。附加extends T 没有任何意义,因为T 没有在该类中定义。同样,这是一个编译时类型 - T 的实际类型在运行时不直接可用。

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

        一个更具体的例子可能会让其他人就设计本身提供更多反馈。

        【讨论】:

          猜你喜欢
          • 2012-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多