9

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

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

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

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

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

def c = new Child1() as Child2

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

4

2 回答 2

7

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

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

于 2009-08-14T07:35:25.203 回答
5

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

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

Set collection = new ArrayList( new HashSet() )

asType方法识别出您想要 aList并且事实HashSet是 a Collection,它只使用ArrayList' 构造函数,该构造函数接受 a Collection

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

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

于 2009-08-15T23:29:14.450 回答