2014-12-19 36 views
4

我有事件(接口)的列表,并通过一个类型列表,而不是接口,这是我想在我的方法如何用Java

public List<Event> getEvents(){ return list;} 

回到我需要初始化列表中的类里面是什么。

List<EventImpl> list = new ArrayList<EventImpl>(); 

出于某种原因,我想我能做到这一点:

List<Event> list = new ArrayList<EventImpl>(); 

但现在看来,我做不到,所以我需要在getEvents一些铸造神奇的()?如果是的话,那是如何做到的?

谢谢

+2

[是列表名单的子类?为什么不是Java的泛型隐式多态?](http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p) – August 2014-12-19 02:02:17

+0

请参阅http ://docs.oracle.com/javase/tutorial/java/generics/erasure.html – smac89 2014-12-19 02:56:58

回答

2

如果你想getEvents()返回一个List<Event>,最简单的方法是建立在首位的方法List<Event>

List<Event> list = new ArrayList<Event>(); 

list最终将只由EventImpl实例就是无关。

如果这是不可能因为某些原因(例如,如果该方法涉及从其他地方取一个List<EventImpl>),你可以通过编写

List<Event> copy = new ArrayList<Event>(listOfEventImpl); 

但是你最好转换List<EventImpl>List<Event>在您的代码中只使用List<Event>ArrayList<Event>,并且避免使用List<EventImpl>ArrayList<EventImpl>。这符合一般的良好实践,您应该尽可能参考接口而不是具体类型。

(或者你可以使用通配符,如其他人所说。)

4

您应该使用List<? extends Event>。 Java对泛型中的类型继承有严格的规则,代码List<Event> list = new ArrayList<EventImpl>();无效。

如果它是有效的,那么你可以有类似list.add(new SomeOtherEventImpl()),其中SomeOtherEventImpl扩展/实现Event但不是EventImpl。这显然会导致错误,因为SomeOtherEventImpl不适用于需要EventImpl的列表。

+0

这个语法(List <?extends Event>)说。任何扩展事件的对象? – 2014-12-19 05:07:24

+0

正确。这将是任何直接或间接扩展事件的类。 – 2014-12-19 05:36:00