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方法背后的类型转换规则究竟是什么?
我相信默认asType行为可以在:org.codehaus.groovy.runtime.DefaultGroovyMethods.java
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.java中找到.
从DefaultGroovyMethods它开始很容易遵循asType特定对象类型和请求的类型组合的行为.
根据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指出了源代码,我将在这个主题上发表很多博客文章.