Groovy类型转换

时间:2009-08-14 02:02:55

标签: groovy type-conversion casting

在Groovy中,您可以使用as运算符或asType方法进行令人惊讶的类型转换。例子包括

Short s = new Integer(6) as Short
List collection = new HashSet().asType(List)

我很惊讶我可以从Integer转换为Short并从Set转换为List,因为这些类型之间没有“is a”关系,尽管它们共享一个共同的祖先。

例如,以下代码相当于Integer / Short示例 转换中涉及的类型之间的关系

class Parent {}
class Child1 extends Parent {}
class Child2 extends Parent {}

def c = new Child1() as Child2

但当然这个例子失败了。 as运算符和asType方法背后的类型转换规则究竟是什么?

2 个答案:

答案 0 :(得分:7)

我相信默认的asType行为可以在以下网址找到:org.codehaus.groovy.runtime.DefaultGroovyMethods.java org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.java

DefaultGroovyMethods开始,对于特定对象类型和请求的类型组合,可以很容易地遵循asType的行为。

答案 1 :(得分:5)

根据Ruben已经指出的最终结果:

Set collection = new HashSet().asType(List)

Set collection = new ArrayList( new HashSet() )

asType方法可识别您需要List并且事实HashSetCollection,它只使用ArrayList的构造函数Collection

对于数字1,它会将Integer转换为Number,然后调用shortValue方法。

我没有意识到转换像这样的引用/值这么多的逻辑,我真诚地感谢Ruben指出了源代码,我将在这个主题上发表很多博客文章。