泛型的继承有什么问题

时间:2015-02-19 11:08:16

标签: java oop generics

我对泛型有疑问。

我定义了基类ServiceObjectServiceObjectsList

class ServiceObject {};
class ServiceObjectsList<T extends ServiceObject> extends ArrayList<T> {};

然后我定义了一些后代类:

class UserServiceObject extends ServiceObject {};
class UserServiceObjectsList extends ServiceObjectsList<UserServiceObject> {};

class ItemServiceObject extends ServiceObject {};
class ItemServiceObjectsList extends ServiceObjectsList<ItemServiceObject> {};

// etc...

现在我需要将UserServiceObjectsList视为ServiceObjectsList<ServiceObject>

如果我写:

ServiceObjectsList displayableServiceObjects; 

然后我无法迭代它们:

for (ServiceObject serviceObject : displayableServiceObjects)

抛出错误&#34;不兼容的类型&#34;。

如果我写ServiceObjectsList<ServiceObject> displayableServiceObjects 然后我无法指定UserServiceObjects

displayableServiceObjects = new UserServiceObjects();

它抛出了相同的&#34;不兼容的类型&#34;错误;

我做错了什么?

所有ServiceObject s,ServiceObjectsList和他们的后代真正需要。然后封装一些功能。

3 个答案:

答案 0 :(得分:2)

您应该在声明中指定泛型类型:

ServiceObjectsList<? extends ServiceObject> displayableServiceObjects; 

并且“不兼容的类型”错误将消失...

答案 1 :(得分:1)

您无法将列表视为ServiceObjectsList<ServiceObject>,因为这不是它的原因。不允许施法。

然而,您可以将列表标注为ServiceObjectsList<? extends ServiceObject> - 一系列扩展ServiceObject的内容。

答案 2 :(得分:1)

简短的回答是我认为你想要实现的目标无法做到的事情,因为ArrayList和ArrayList并不是真正独立的类,就像它们在C ++中一样,模板更多喜欢聪明的宏而不是Java泛型。

定义class ServiceObjectsList<T extends ServiceObject> extends ArrayList<T> {}时,您已经创建了一个适当的ArrayList子类,但ServiceObjectsList仍然是通用的。然后,当您在不添加类型参数的情况下声明变量ServiceObjectsList displayableServiceObjects;时,它与ServiceObjectsList<Object>相同。限定符<T extends ServiceObject>将在编译时检查,但前提是您在变量上声明了一个类型参数。