【问题标题】:Overriding type parameters覆盖类型参数
【发布时间】:2012-05-20 00:27:46
【问题描述】:

我想实现以下具有以下层次结构的类:

public class DwellingPropertySetter
    extends AbstractPropertySetter<Dwelling>

public class HousePropertySetter
    extends DwellingPropertySetter<House>

public class SkyscrapperPropertySetter
    extends HousePropertySetter<Skyscrapper>

很遗憾,这段代码无法编译。一种方法是:

public class DwellingPropertySetter<T extends Dwelling>
    extends AbstractPropertySetter<T>

public class HousePropertySetter<T extends House>
    extends DwellingPropertySetter<T>

public class SkyscrapperPropertySetter<T extends Skyscrapper>
    extends HousePropertySetter<T>

但对我来说那些extends 关键字是不必要的。 每当我想使用SkyscrapperPropertySetter 时,我都必须指定一个类型参数。这是没用的,然后看起来像SkyscrapperPropertySetter&lt;Skyscraper&gt;

你知道我的出路吗?我知道实现我的第一个层次结构的唯一其他方法是使用接口和委托方法。

【问题讨论】:

  • 当您的第一个示例似乎可以满足您的需要时,为什么要使用泛型(就像在您的第二个示例中一样)?
  • 因为我的第一个示例无法编译。 :-)
  • @NewTalk,这是一个可能很愚蠢的问题:为什么它不能编译?
  • @aioobe 因为 DwellingPropertySetter 类型不是通用的;它不能用参数 参数化

标签: java generics inheritance hierarchy parameterized


【解决方案1】:

我认为你已经正确认识到拥有像 ChickenArrayList 这样的东西是没有意义的,所以你可以创建类似的东西

class ChickenArrayList extends ArrayList<Chicken>

或者,如果您想重用 ChickenArrayList 中的某些功能,您可能必须使其抽象(和泛型)并在其上放置另一个具体的非泛型类:

class AbsChickenArrayList<T extends Chicken> extends ArrayList<T>
// and
class ChickenArrayList extends AbsChickenArrayList<Chicken>
class HenArrayList extends AbsChickenArrayList<Hen>

我知道这很冗长,但这是你可以用这种 ~ 18 岁的语言做的最好的事情。

【讨论】:

    【解决方案2】:

    我认为你可以达到合理的程度。如果你有

    public class DwellingPropertySetter
    extends AbstractPropertySetter<Dwelling>
    

    这意味着您已经将DwellingPropertySetter 设为非泛型,所有方法签名都将使用Dwelling。如果你说

    public class DwellingPropertySetter<T extends Dwelling>
    extends AbstractPropertySetter<T>
    

    这意味着可以有各种各样的DwellingPropertySetters——你真的想要不同的,所以我认为这是你真正想要保留的。或者是你的抱怨是你想要一个没有参数的DwellingPropertySetter,假设Dwelling,以及一个扩展DwellingPropertySetter&lt;T&gt;的子类和不同的T? Java 泛型无法做到这一点。

    【讨论】:

    • 是的。我想要一个不带参数的DwellingPropertySetter 和一个扩展DwellingPropertySetter&lt;T&gt; 的子类,并使用不同的T。为什么这在技术上是不可能的? :-(
    • 在 Java 泛型中,以及在其他语言中相同概念的所有其他实现中,类型要么接受类型参数,要么不接受类型参数。我从未见过类型参数是可选的默认值的情况。编辑我google了一下,C++居然does support这样的功能。
    • @NewTalk 没有任何东西可以阻止你在没有泛型的情况下编写SkyscrapperPropertySetter sps = new SkyscrapperPropertySetter()
    • @assylias 仅当他禁用编译器警告时,否则屏幕将爬满黄色曲线:)
    猜你喜欢
    • 2019-08-17
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多