我有一个Event(接口)列表,这就是我想在我的方法中返回的内容
public List<Event> getEvents(){ return list;}
在课堂内我需要初始化列表。
List<EventImpl> list = new ArrayList<EventImpl>();
出于某种原因,我认为我可以这样做:
List<Event> list = new ArrayList<EventImpl>();
但似乎我不能,所以我需要在getEvents()中使用一些魔法吗?如果是这样,那怎么办?
由于
答案 0 :(得分:4)
您应该使用List<? extends Event>
。 Java对泛型中的类型继承有严格的规则,代码List<Event> list = new ArrayList<EventImpl>();
无效。
如果它有效,那么您可以使用list.add(new SomeOtherEventImpl())
,其中SomeOtherEventImpl
扩展/实现Event
但不是EventImpl
。这显然会导致错误,因为SomeOtherEventImpl
不适合需要EventImpl
的列表。
答案 1 :(得分:2)
如果您希望getEvents()
返回List<Event>
,最简单的方法是首先在方法中创建List<Event>
:
List<Event> list = new ArrayList<Event>();
list
最终只包含EventImpl
个实例的事实无关紧要。
如果出于某种原因无法做到这一点(例如,如果该方法涉及从其他地方提取List<EventImpl>
),您可以通过编写1}}将List<EventImpl>
转换为List<Event>
p>
List<Event> copy = new ArrayList<Event>(listOfEventImpl);
但是,您最好只在代码中使用List<Event>
和ArrayList<Event>
,并避免使用List<EventImpl>
和ArrayList<EventImpl>
。这符合一般的良好实践,你应尽可能参考接口而不是具体类型。
(或者您可以使用通配符,正如其他人所建议的那样。)