在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
方法背后的类型转换规则究竟是什么?
答案 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
并且事实HashSet
是Collection
,它只使用ArrayList
的构造函数Collection
。
对于数字1,它会将Integer
转换为Number
,然后调用shortValue
方法。
我没有意识到转换像这样的引用/值这么多的逻辑,我真诚地感谢Ruben指出了源代码,我将在这个主题上发表很多博客文章。