2011-11-17 116 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[]