我对泛型有疑问。
我定义了基类ServiceObject
和ServiceObjectsList
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
和他们的后代真正需要。然后封装一些功能。
答案 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>
将在编译时检查,但前提是您在变量上声明了一个类型参数。