你的假設是真正站在相反:
Iterable<? extends iface_classB> getThings();
意味着getThings()
返回可迭代的對象具有至少iface_classB
的功能。因此,您不能將結果從getThings()
分配到任何Iterable<impl_of_iface_classB>
,因爲您只能確定這些對象公開的iface_classB
的功能。
例如,如果getThings()
返回的對象實際上是Iterable<impl2_of_iface_classB>
,其中impl2_of_iface_classB
延伸iface_classB
怎麼辦? 可迭代的對象將不具有impl_of_iface_classB
對象的功能。
在實踐中,如果B1
和B2
從B
派生出來,它是完全允許有
A<? extends B> x;
A<B1> y;
A<B2> z;
x = y;
x = z;
因此getThings()
不能在在什麼樣的泛型參數代表方面的依據:它只能被消耗作爲「普通」iface_classB
。
更重要的是,你可以指望Iterable<iface_classB>
,但是你不能(除非你執行一個未經檢查的轉換,那就是)。這是因爲通配符符號本質上意味着「一組可行的通用參數」。假設你用通配符替換通配符,如果參數不匹配,由於不兼容的類型,你會得到通常的編譯時錯誤。編譯器必須考慮所有情況,不允許你這樣做。因此,
A<? extends B> x;
A<B> y = x;
同時有效安全的,是不允許的,因爲x
可以被賦予不同的參數從B
,產生不同類型轉讓的雙方。相反,
A<B> x;
A<? extends B> y = x;
被允許,因爲y
類型代表一套方案,那集包括A<B>
。只要y
像上面那樣分配,實際選擇集合的具體估價。
你得到的錯誤是什麼? –
請顯示錯誤。還要確保你不會混淆迭代器和Iterable。從你展示的內容來看,它應該起作用。 – jonasr
eclipse在此行標記爲錯誤。我也不瞭解迭代器......因爲我是Java新手。我的書沒有涵蓋Java的這些新標準。 Iterable和Iterator類有什麼不同?有人可以把答案的鏈接或給我簡短的解釋嗎? – ptee