2012-02-19 25 views
2

現在,然後在我的代碼中,我發現我可以通過使用裸泛型類或使用通配符來解決問題。在Java泛型中使用<?>有什麼「好」的理由?

我哪裏有這樣的一類設計:

Class World<T, C> { .... } 

肯定一般是使我的代碼更清潔比它本來沒有泛型。

然而,有時我用

World theWorld; 

或有時我結束了

World<?, ?> theWorld; 

我這樣做,因爲它似乎是如何才能使編譯器接受它,我 嘗試避免它們導致我更多地投射或繼承複雜性。

它看起來醜陋和臭我,但我不能證明增加的複雜性,它看起來像我需要引進,以避免它。

什麼是某些情況下(如果有的話),你相信使用一個裸體或通配符一般是可以接受的Java習慣?

回答

3

任何時候你可以使用泛型,但不需要它在具體情況。 <?>大致上告訴編譯器:「我知道泛型,但現在我不需要這種類型」。

也許這種類型是在其他情況下需要的。例如。如果你有一個Set只存儲任何東西,比如緩存,而你根本不關心這些元素的類型。在其他時候,當你處理特定元素時。

如果使用太鬆散結合型參數(如<?>這是相當鬆散的),但後來嘗試確定類型,例如它的氣味與instanceof或一些自定義類型鑑別器。然後,一些設計不佳。

4

在泛型教程的Wildcards部分中有一個使用<?>的很好的示例(用例)。

一個排序總結:如果你想寫一個printCollection方法接受所有種類的Collection你可以使用Collection<?>作爲參數類型。您不能使用Collection<Object>作爲參數類型,因爲它不是所有種類集合的超類型。

使用Collection<?>,而不是在這種情況下,「純」 Collection是安全的,因爲你不能在printCollection方法項添加到Collection<?>(除空)。當你想存儲多個對象,這是另一個類的子類

+0

好吧,我覺得有道理......除了我不跟隨「因爲它是不是所有類型的集合的超類型不能使用收集作爲參數類型用於這一目的。」我認爲這將是...我會認爲你不能這麼做的原因是Collection 與Collection 特別不一樣。鑑於,收集<?擴展對象>將是邏輯的,但這相當於Collection 。你可否確認? – pitosalas 2012-02-20 21:21:36

+0

集合和Collection <?擴展Object>幾乎相同。看到這個小的區別答案:http://stackoverflow.com/a/2016382/122442 – 2012-02-20 22:07:02

1

通配符也證明是非常有用的。

例如:

Collection<? extends Shape> myShapes 

該系列現在可以把所有的對象,是Shape的子類。 因此,當添加Shape的子類的任何對象時,您都是類型安全的。例如:

myShapes.add(new Rectangle()) 
myShapes.add(new Triangle()) 
+0

有趣!我曾嘗試過「Collection a;」並發現這是無效的。所以使用「?」代替! – pitosalas 2012-02-20 21:18:58

+0

只有當你實現它的類本身是泛型時,T纔有效,這意味着只要該類的對象被實例化,T就會被VM知道。 – devsnd 2012-02-20 21:53:21

相關問題