Groovy类型转换
问题描述:
在Groovy中,您可以使用as
运算符或asType
方法进行令人惊讶的类型转换。例子包括Groovy类型转换
Short s = new Integer(6) as Short
List collection = new HashSet().asType(List)
我很惊讶,我可以从一个Integer到短而从一组到列表转换,因为没有“是”,这些类型之间的关系,虽然他们有一个共同祖先。
例如,下面的代码等同于整数/短示例中所涉及的转化
class Parent {}
class Child1 extends Parent {}
class Child2 extends Parent {}
def c = new Child1() as Child2
当然,这个例子失败的,但各类型之间的关系 方面。 as
运营商和asType
方法背后的类型转换规则究竟是什么?
答
我相信默认asType
行为可以在:org.codehaus.groovy.runtime.DefaultGroovyMethods.java org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.java。
从DefaultGroovyMethods
开始,对于特定的对象类型和请求的类型组合很容易遵循asType
的行为。
答
根据什么鲁文已经指出了最终结果:
Set collection = new HashSet().asType(List)
是
Set collection = new ArrayList(new HashSet())
的asType
方法能够识别出您想要一个List
并且是事实HashSet
是Collection
,它只是使用ArrayList
的构造函数,它需要一个Collection
。
至于数字1,它将Integer
转换为Number
,然后调用shortValue
方法。
我没有意识到有如此多的逻辑来转换这样的参考文献/值,我衷心感谢Ruben指出来源,我会在这个主题上发布不少博客文章。