2014-12-19 21 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