2011-11-17 145 views
2

我檢討別人的Grails的代碼,我看到以下內容:隱式類型轉換?

Set<Integer> weeks = new ArrayList<Integer>() 

它看起來像後,該行設定的是,Grails認爲周是HashSet。我不熟悉Java或Grails,並且(java)文檔看起來像ArrayList extends List和HashSet extends Set,但是這種直接構造不起作用。這是一個Grails的事情嗎?謝謝。

+0

我不知道聖盃,但是這段代碼編譯好嗎?有沒有TypeMismatch錯誤> – Zohaib

回答

4

在Groovy看到new ArrayList<Integer>()有些不尋常,因爲[]的工作原理相同而且不太冗長,所以我會把它寫成Set<Integer> weeks = []。然後它會更清楚地說明發生了什麼 - Groovy正在將一種集合類型轉換爲另一種集合類型,其中[]確實是一種創建持有者並填充初始數據(如果有的話)的便捷方式。由於除[]之外的List[:]之外沒有任何語法糖,因此您需要進行這些轉換。

def weeks = [] as Set可能是更常見的語法。這也是更清晰的,因爲[]只是暫時的,並且使用「as」進行轉換,並且更明確地不僅僅是在左側聲明類型。

您也可以使用它將集合轉換爲數組。您不能使用Java語法來創建數組,因爲它使用大括號並且看起來像一個Closure定義,所以您不必使用int[] numbers = new int[] { 1, 2, 3 }來做int[] numbers = [1, 2, 3]def numbers = [1, 2, 3] as int[]