如何在java中传递类型列表而不是接口

时间:2014-12-19 01:59:49

标签: java casting

我有一个Event(接口)列表,这就是我想在我的方法中返回的内容

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

在课堂内我需要初始化列表。

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

出于某种原因,我认为我可以这样做:

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

但似乎我不能,所以我需要在getEvents()中使用一些魔法吗?如果是这样,那怎么办?

由于

2 个答案:

答案 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>),您可以通过编写List<EventImpl>转换为List<Event> p>

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

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

(或者您可以使用通配符,正如其他人所建议的那样。)