2013-08-16 43 views
0

我已閱讀有效的Java它強調在可能的情況下使用接口作爲返回類型。擴展論點我想知道以下哪種方法是首選/被認爲是一種好的做法。應該將接口用於類型參數

OPTION 1:

Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>(); // Interface 'Set' declared in type 
for (int v = 0; v < graph.getNumberOfVertices(); v++) { 
    map.put(v, new HashSet<Integer>()); 
} 

選項2:

Map<Integer, Set<Integer>> map = new HashMap<Integer, HashSet<Integer>>(); // Class 'HashSet' declared in type. 
for (int v = 0; v < graph.getNumberOfVertices(); v++) { 
    map.put(v, new HashSet<Integer>()); 
} 
+1

那麼,如果您要從方法返回該映射,那麼接口更喜歡的規則仍然適用。 – Kayaman

+2

那麼,第二個不編譯,雖然... –

+0

前者更一般,所以除非你有一個很好的理由不,我寧願這種方法。 – assylias

回答

2

當然應該使用選項1。選項2不會編譯,因爲Map<Integer, HashSet<Integer>>不是Map<Integer, Set<Integer>>

0

是的,除非你有特定的理由迫使你的接口的用戶使用特定的實現,否則通常更喜歡類型參數的接口。

在這種情況下,假設您將要返回map,則地圖的值將被轉換爲Map<Integer, Set<Integer>> map的賦值。

編輯:除了不會因爲在Java中,因爲Java不支持協變類型參數,所以Map<Integer, HashSet<Integer>>不是`Map>。但它會在斯卡拉工作;)

0

選項1是更通用的選項,假設其他人指出的錯誤。

這種類型的編程通常是更有用的版本,因爲它可以用於所有類型的集合。 這樣,如果您使用的是不同的集合類型,則不必編寫所述代碼的多個版本。

相關問題