Groovy类型转换

Dón*_*nal 9 groovy casting type-conversion

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

Short s = new Integer(6) as Short
List collection = new HashSet().asType(List)
Run Code Online (Sandbox Code Playgroud)

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

例如,就转换中涉及的类型之间的关系而言,以下代码等同于Integer/Short示例

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

def c = new Child1() as Child2
Run Code Online (Sandbox Code Playgroud)

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

Rub*_*ben 7

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

DefaultGroovyMethods它开始很容易遵循asType特定对象类型和请求的类型组合的行为.


Cha*_*ing 5

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

Set collection = new HashSet().asType(List)
Run Code Online (Sandbox Code Playgroud)

Set collection = new ArrayList( new HashSet() )
Run Code Online (Sandbox Code Playgroud)

asType方法认识到你想要一个List并且事实HashSet是一个Collection,它只是使用ArrayList的构造函数需要一个Collection.

至于数字1,它将转换Integer为a Number,然后调用shortValue方法.

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