Groovy使上面的例子简单到难以置信,目前我们仅仅看到为什么一切都是对象有助于保持代码的紧凑和可读,看看上一节的代码块,能看到在循环体的最后两行的代码的问题。
为了求和,必须将Integer转换为int,然后为了保存在另一个list中,我们也不得不创建一个新的Integer,groovy给java.lang.Integer增加了plus方法,然后你可以这样写代码:results.add (first.plus(second))
到目前为止,没有任何java类库设计者考虑增加一个plus方法,groovy允许操作符运用在对象上,作为上一节循环体的最后部分的替代。// Java
int sum = first.intValue()+second.intValue();
results.add (new Integer(sum));
使用更加可读的Groovy的解决办法。results.add (first + second)
将学习到操作符更多的知识,并且可以根据需要自己来实现操作符。
为了使groovy实现完全的面向对象,由于JVM不支持在专有类型上的面向对象操作(如方法调用),groovy设计者决定废除专有类型,当groovy需要存储一个java专有类型的值的时候,groovy使用java平台已经存在的包装类型进行包装,表3.1是包装类型的完整列表。
表3.1 java专有类型和它们的包装类型
在groovy代码中,任何时候看到专有类型值(比如数字5,或者布尔值true),它都是相应的包装类型实例的一个引用。为了简洁和习惯,groovy允许声明变量为专有类型的变量,但是不要被欺骗,后台真正使用的类型是包装类型,字符串和数组(arrays)没有在表3.1中列出,因为它们已经是引用类型,不是专有类型,所以不需要包装类。
尽管有了java的语法,但是仔细检查java和groovy数字的格式,也能发现它们稍微有些不同,因为groovy允许通过字面格式实例化java.math.BigDecimal和java.math.BigInteger,表3.2列出了通过字面格式可以在groovy使用的数字类型。
表3.2 在groovy在的数字格式
注意groovy是怎么样决定是使用BigInteger或者BigDecimal的,这是通过数字后面的“G”,或者是否出现小数点来决定的,此外,注意BigDecimal是默认的非整数类型——除非指定后缀强制类型为Float或者Double,否则将使用BigDecimal。