2013-10-30 21 views
0

我注意到在生產中的Java代碼很多場合中,重要性?在Java模板參數

Collection< ? extends foo> var 

使用我的問題是不

Collection<foo> var 

意思是相同的。一個人與另一個人的語義差異是什麼?

謝謝!

+1

搜索「[java]通配符泛型」。 ('?'是通配符生成的一部分,Java「templates」是[Generic(types)](http://docs.oracle.com/javase/tutorial/java/generics/)。) – user2864740

回答

1

假設我們有一個方法

void foo(List<Parent> bar) 

,我們希望通過它List<Child>,遺憾的是我們不能。如果FooBar的子類型,那麼通用容器不是「協變的」,那麼List<Foo>不是List<Bar>的子類型,它們是不變的。爲了解決這個問題,我們使用通配符。

如果我們宣佈我們的方法

void foo(List<? extends Parent> bar) 

現在我們可以通過它List<Child>List<Parent>。與extends通配符給我們協變。

雙重,如果我們想傳遞的對象列表,Child是的一個亞型,那麼我們可以做

void foo(List<? super Child>) 

,並通過它List<Parent>。這是「協變性」,就像協變性一樣,但是沒有成功。

這是一個稍微令人困惑的話題,但差異的要點是允許集合具有與它們的參數相同的子類型和超類型。

+0

非常感謝 – subramanian

1

因爲Collection<? extends Foo>匹配Collection<SubClassOfFoo>,而Collection<Foo>沒有。

簡而言之,如果SubClass extends Foo,那麼它不是真的Collection<SubClass> extends Collection<Foo>,所以你需要使用通配符來表示你允許收集子類。

0

Collection<foo> var表示它僅包含foo及其子類。 Collection< ? extends foo> var表示它只能包含foo的一個特定子類及其子類。這是完全不同的。