Java 重写类型参数

Java 重写类型参数,java,generics,inheritance,hierarchy,parameterized,Java,Generics,Inheritance,Hierarchy,Parameterized,我想用以下层次结构实现以下类: public class DwellingPropertySetter extends AbstractPropertySetter<Dwelling> public class HousePropertySetter extends DwellingPropertySetter<House> public class SkyscrapperPropertySetter extends HouseProperty

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

public class DwellingPropertySetter
    extends AbstractPropertySetter<Dwelling>

public class HousePropertySetter
    extends DwellingPropertySetter<House>

public class SkyscrapperPropertySetter
    extends HousePropertySetter<Skyscrapper>
公共类住宅物业设置
扩展AbstractPropertySetter
公共级房产酒店
扩展居住属性设置
公共类SkyScrasterPropertySetter
扩展房产设置
不幸的是,这段代码无法编译。一种方法是:

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>
公共类住宅物业设置
扩展AbstractPropertySetter
公共级房产酒店
扩展居住属性设置
公共类SkyScrasterPropertySetter
扩展房产设置
但对我来说,那些
扩展
关键字是不必要的。 每当我想使用
SkyScrasterPropertySetter
时,我都必须指定一个类型参数。这是无用的,然后看起来像
skysarserpropertysetter


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

我认为您可以实现合理的目标。如果你有

public class DwellingPropertySetter
extends AbstractPropertySetter<Dwelling>

这意味着可以有不同的
居住属性设置-
s-,你真的希望有不同的,所以我认为这是你真正想要保留的。或者是您的抱怨,您需要一个不带参数的
住宅属性设置器
,其中假定
住宅
,以及一个扩展
住宅属性设置器
的子类,该子类使用不同的
T
?Java泛型无法做到这一点。

我认为您已经正确认识到,使用ChickenArrayList之类的东西是毫无意义的,因此您可以创建

class ChickenArrayList extends ArrayList<Chicken>
class ChickenArrayList扩展了ArrayList
或者,如果您想重用ChickenArrayList中的某些功能,您可能需要将其抽象(和泛型)并在其上放置另一个具体的非泛型类:

class AbsChickenArrayList<T extends Chicken> extends ArrayList<T>
// and
class ChickenArrayList extends AbsChickenArrayList<Chicken>
class HenArrayList extends AbsChickenArrayList<Hen>
类AbsChickenArrayList扩展了ArrayList
//及
类ChickenArrayList扩展了AbsChickenArrayList
类HenArrayList扩展了AbsChickenArrayList

我知道这很冗长,但这是使用这种已有18年历史的语言所能做到的最好的方法。

当第一个示例似乎满足您的需要时,为什么要使用泛型(如第二个示例中的泛型)?因为我的第一个示例无法编译。:-)@NewTalk,这里有一个潜在的愚蠢问题:它为什么不编译?@aioobe因为类型住宅属性设置不是泛型的;它不能用参数Yes参数化。我想要一个没有参数的
relayingpropertysetter
,以及一个扩展
relayingpropertysetter
的子类,该子类使用不同的
T
。为什么这在技术上不可行-(在java泛型中,但在其他语言中,同样的概念在其他所有实现中,一种类型都是做或不取类型参数。我从来没有见过一个类型PARAM是默认值的情况。编辑我Google有点,C++实际上是这样的一个特性。”NeXTalk没有任何东西阻止你编写代码>摩天大楼。tySetter sps=new SkyScrasterPropertySetter()不带泛型。@仅当他禁用编译器警告时才使用ASSYLAS,否则屏幕将出现黄色扭曲:)
class AbsChickenArrayList<T extends Chicken> extends ArrayList<T>
// and
class ChickenArrayList extends AbsChickenArrayList<Chicken>
class HenArrayList extends AbsChickenArrayList<Hen>