覆盖类型参数

时间:2012-05-11 11:54:24

标签: java generics inheritance hierarchy parameterized

我想用以下层次结构实现以下类:

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<Skyscraper>

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

2 个答案:

答案 0 :(得分:2)

我认为你已经正确地认识到像ChickenArrayList&lt; Chicken&gt;这样的东西是没有意义的,所以你可以创建像

这样的东西
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岁的语言最好的。

答案 1 :(得分:1)

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

public class DwellingPropertySetter
extends AbstractPropertySetter<Dwelling>

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

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

这意味着可以有各种DwellingPropertySetter - 你真的想拥有不同的,所以我认为这是你真正想要保留的。或者您的抱怨是,您希望DwellingPropertySetter没有args,假设Dwelling,还有一个子类DwellingPropertySetter<T>T不同? Java Generics无法做到这一点。