1

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

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关键字是不必要的。每当我想使用 a 时SkyscrapperPropertySetter,我都必须指定一个类型参数。这是没用的,然后看起来像SkyscrapperPropertySetter<Skyscraper>.

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

4

2 回答 2

2

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

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 岁的语言做的最好的事情。

于 2012-05-11T12:16:06.527 回答
1

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

public class DwellingPropertySetter
extends AbstractPropertySetter<Dwelling>

这意味着您已经制作了DwellingPropertySetter非泛型,所有方法签名都将使用Dwelling. 如果你说

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

这意味着可以有各种各样DwellingPropertySetter的 s - 你真的想要不同的,所以我认为这是你真正想要保留的。或者是你的抱怨是你想要一个DwellingPropertySetter没有参数的a,Dwelling假设在哪里,DwellingPropertySetter<T>以及一个用不同扩展的子类T?Java 泛型无法做到这一点。

于 2012-05-11T11:56:18.227 回答