【问题标题】:How to disable generic inheritance for the super class如何禁用超类的泛型继承
【发布时间】:2016-10-02 17:39:55
【问题描述】:

我有一个类Foo,它具有这个实例属性:一个由名为SuperClass 的类构造的对象。这个SuperClass 是另一个类的父类,比如说...SubClass

事实上,我会更准确地说。 Foo 的属性可以是任何东西(泛型),但这个“任何东西”必须从 SuperClass 扩展。你可以看看下面的代码(这是我所说的翻译)。

class Foo<K extends SuperClass> {
   K attr;
}

事实上,K 必须是一个SubClass 对象。不是直接SuperClass 一个。

但我尝试使用 K = SuperClass... 创建一个 Foo 对象进行测试,它可以工作... 问题出在此。

那么,您知道如何避免使用SuperClass 而不是一个孩子来创建Foo 对象吗?

【问题讨论】:

  • 我认为使用instanceOf 处理Exception 可能是正确的,但还有其他方法吗?
  • 通常在 OO 中,基类或接口定义了可用的内容,实现类填充行为;请参阅en.wikipedia.org/wiki/Liskov_substitution_principle 的 Liskov 替代原则。因此,仅允许派生类但排除它们的基类对我来说没有多大意义。我想您可以为此目的在层次结构中添加另一个类。但也许试着解释一下你真正想做的事情以及为什么你不能接受 SuperClass。
  • 简单解决方案:class Foo { SubClass attr; }。高级解决方案:class Foo&lt;K extends SubClass&gt; { K attr; }。如果简单的解决方案无法满足您的要求,请仅使用高级解决方案。
  • 为什么不希望K 成为SuperClass?很难想象你想要完成什么。
  • 另一个简单的解决方案:声明 SuperClass 抽象。它将确保该类的任何对象都不存在,因此分配给 attr 的任何对象都将属于 SuperClass 的某个子类。

标签: java generics inheritance java-8


【解决方案1】:

使用泛型,如果你使用:

K extends SuperClass

意味着 SuperClass 类型及其子类是可接受的,因此您的程序正在接受 SuperClass。

如果您只想接受 SubClass 及其子类,请使用:

K extends SubClass

【讨论】:

    【解决方案2】:

    使SuperClass 抽象或创建Interface

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 2018-09-27
      • 2015-09-15
      • 2018-08-01
      相关资源
      最近更新 更多