2011-08-17 65 views
2

爲什麼這個不行...實現和集合

public ArrayList<Edge> getEdges() { 

return A; 

//A is an Arraylist of type 'Action'. Action implements Edge. 

} 

接口邊緣包括:公共的ArrayList getEdges();

即使這樣做。

public Edge getEdges() { 

return B; 

//B is an 'Action'. Action implements Edge. 

} 

界面邊緣包括:公共邊緣getEdges();

謝謝你, 切特

回答

7

因爲儘管EdgeAction一個亞型,ArrayList<Action>不是ArrayList<Edge>一個亞型。

改爲使用ArrayList<? extends Edge>

你可以看看this tutorial's 4. Wildcard section,雖然我建議只是仔細閱讀它,因爲它確實有幫助。

0

因爲泛型類型必須相同,不是從它擴展你可以重寫這樣,它的工作:

public ArrayList<? extends Edge> getEdges() { 

return A; 

//A is an Arraylist of type 'Action'. Action implements Edge. 

} 
2

這是因爲ArrayList<E>不是covariant上鍵入E。也就是說,您不能僅僅因爲Derived繼承自Base而將ArrayList<Derived>的實例替換爲ArrayList<Base>

考慮這種情況:String繼承自Object; 然而,如果這意味着你可以使用一個ArrayList<String>作爲ArrayList<Object>然後將下面的代碼將是可能的:

ArrayList<Object> list = new ArrayList<String>(); 
list.add(new Integer(5)); // Integer inherits from Object 

以上不能正常工作,因爲你不能添加IntegerArrayList<String>。如果可以,那麼這可能會發生:

ArrayList<String> stringList = (ArrayList<String>)list; 
String string = stringList.get(0); // Not a string! 

至於Ziyao has indicated,實現這個正確的方法是使用? extends Edge語法。

2

香蕉水果。香蕉列表不是水果列表。

Oherwise有人可以構建一個香蕉列表,傳遞給你一個水果列表的引用,並且你會(正確地)在其中插入一個蘋果。香蕉名單的所有者會感到驚訝。

+1

[我是香蕉](http://www.youtube.com/watch?v=LH5ay10RTGY&ob=av3e) – mre