Groovy 自动装箱和拆箱

在java和别的支持相同概念的语言中,转换一个专有类型的值为一个包装类型的动作叫做装箱,反向动作——把一个包装实例的值让一个专有类型接收,这样的动作叫做拆箱。

Groovy在需要的时候自动进行装箱和拆箱处理,主要用在从groovy中调用java方法时,这种自动进行装箱和拆箱就是我们知道的自动包装(autoboxing)。

我们已经看到groovy被设计得与java一样好,因此,当一个java方法接受一个专有类型参数或者返回一个专有类型的时候发生了什么?怎样从groovy中调用这个方法呢?

考虑一下在java.lang.String类中已经存在的方法:int indexOf(int ch)。

可以在groovy中像这样调用这个方法:assert 'ABCDE'.indexOf(67) == 2从groovy的观点来看,传递一个包含值67(67是字母C的Unicode值)的Integer 实例,尽管方法期望的参数类型是专有类型int,groovy处理拆箱工作,方法返回一个专有类型int的值,在这个值返回到groovy的时候立刻自动进行装箱处理。

然后在groovy脚本中比较值为2的Integer,图3.1显示了从groovy到java和从java到groovy的处理过程。

所有这些处理都是透明的,这意味着不需要在groovy中进行任何特殊处理来触发它,现在明白了自动装箱,在一个对象上怎样应用操作符变得十分有趣。