【发布时间】: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<K extends SubClass> { K attr; }。如果简单的解决方案无法满足您的要求,请仅使用高级解决方案。 -
为什么不希望
K成为SuperClass?很难想象你想要完成什么。 -
另一个简单的解决方案:声明 SuperClass 抽象。它将确保该类的任何对象都不存在,因此分配给 attr 的任何对象都将属于 SuperClass 的某个子类。
标签: java generics inheritance java-8