【问题标题】:Groovy type conversionGroovy 类型转换
【发布时间】:2010-11-19 12:39:41
【问题描述】:

在 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方法背后的类型转换规则究竟是什么?

【问题讨论】:

    标签: groovy type-conversion casting


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      Set collection = new ArrayList( new HashSet() )
      

      asType 方法识别出你想要一个List,而事实上HashSet 是一个Collection,它只使用ArrayList 的构造函数,它接受一个Collection

      对于数字一,它将Integer转换为Number,然后调用shortValue方法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-11
        • 2011-03-20
        • 1970-01-01
        • 2012-11-20
        • 2012-08-04
        • 1970-01-01
        相关资源
        最近更新 更多