2012-06-04 69 views
3

我是Java新手。有人能告訴我這條線是什麼意思?Iterable <?擴展iface_class>

class_A 
... 
Iterable< ? extends iface_classB> getThings(); 

其中iface_classB可以是classB的接口/摘要。

我得到的錯誤,當我寫的東西如:

class_A myA = new classA() 

Iterable<impl_of_iface_classB> anIterator = myA.getThings() 

我想知道在模板中的問號。我的猜測是,它應該是來自iface_classB的任何東西,但似乎我錯了。

非常感謝您的任何答案。

+0

你得到的錯誤是什麼? –

+0

請顯示錯誤。還要確保你不會混淆迭代器和Iterable。從你展示的內容來看,它應該起作用。 – jonasr

+0

eclipse在此行標記爲錯誤。我也不瞭解迭代器......因爲我是Java新手。我的書沒有涵蓋Java的這些新標準。 Iterable和Iterator類有什麼不同?有人可以把答案的鏈接或給我簡短的解釋嗎? – ptee

回答

4

你的假設是真正站在相反:

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對象的功能。

在實踐中,如果B1B2B派生出來,它是完全允許有

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像上面那樣分配,實際選擇集合的具體估價。

相關問題