我注意到在生產中的Java代碼很多場合中,重要性?在Java模板參數
Collection< ? extends foo> var
使用我的問題是不
Collection<foo> var
意思是相同的。一個人與另一個人的語義差異是什麼?
謝謝!
我注意到在生產中的Java代碼很多場合中,重要性?在Java模板參數
Collection< ? extends foo> var
使用我的問題是不
Collection<foo> var
意思是相同的。一個人與另一個人的語義差異是什麼?
謝謝!
假設我們有一個方法
void foo(List<Parent> bar)
,我們希望通過它List<Child>
,遺憾的是我們不能。如果Foo
是Bar
的子類型,那麼通用容器不是「協變的」,那麼List<Foo>
不是List<Bar>
的子類型,它們是不變的。爲了解決這個問題,我們使用通配符。
如果我們宣佈我們的方法
void foo(List<? extends Parent> bar)
現在我們可以通過它List<Child>
或List<Parent>
。與extends
通配符給我們協變。
雙重,如果我們想傳遞的對象列表,Child
是的一個亞型,那麼我們可以做
void foo(List<? super Child>)
,並通過它List<Parent>
。這是「協變性」,就像協變性一樣,但是沒有成功。
這是一個稍微令人困惑的話題,但差異的要點是允許集合具有與它們的參數相同的子類型和超類型。
非常感謝 – subramanian
因爲Collection<? extends Foo>
匹配Collection<SubClassOfFoo>
,而Collection<Foo>
沒有。
簡而言之,如果SubClass extends Foo
,那麼它不是真的Collection<SubClass> extends Collection<Foo>
,所以你需要使用通配符來表示你允許收集子類。
Collection<foo> var
表示它僅包含foo
及其子類。 Collection< ? extends foo> var
表示它只能包含foo
的一個特定子類及其子類。這是完全不同的。
搜索「[java]通配符泛型」。 ('?'是通配符生成的一部分,Java「templates」是[Generic(types)](http://docs.oracle.com/javase/tutorial/java/generics/)。) – user2864740