我如何使用groovy的AS关键字

时间:2012-11-16 18:15:11

标签: groovy as-keyword

这可能是重复但是" as"谷歌是一个令人难以置信的硬关键词,甚至是S.O.忽视" as"作为查询的一部分。

所以我想知道如何实现一个支持" as"本能。对于示例类:

class X {
    private val
    public X(def v) {
        val=v
    }
    public asType(Class c) {
        if (c == Integer.class)
            return val as Integer
        if(c == String.class)
            return val as String
    }
}

这允许类似:

new X(3) as String

工作,但没有帮助:

3 as X

我可能必须附加/修改" asType"以某种方式在字符串和整数上,但我觉得这样的任何变化都应该局限于" X" class ... X类可以实现类似的方法:

X fromObject(object)

或以某种方式修改X中的String / Integer类。这看起来很难,因为它不会在X中执行任何代码,直到实际使用X ...如果我第一次使用X是" 3作为X",在Groovy尝试调用之前,X是否有机会覆盖Integer的asType?

2 个答案:

答案 0 :(得分:5)

正如您所说,将asType Integer的方法更改为接受X作为一种新类型的转换(特别是在不破坏现有功能的情况下)并不容易。

我能想到的最好的事情就是:

Integer.metaClass.toX = { -> new X( delegate ) }

然后你可以打电话:

3.toX()

我无法想象如何3 as X可以做到 - 正如你所说,另一种方式; new X('3') as Integer相对容易。


实际上,你可以这样做:

// Get a handle on the old `asType` method for Integer
def oldAsType = Integer.metaClass.getMetaMethod( "asType", [Class] as Class[] )

// Then write our own
Integer.metaClass.asType = { Class c ->
  if( c == X ) {
    new X( delegate )
  }
  else {
    // if it's not an X, call the original
    oldAsType.invoke( delegate, c )
  }
}

3 as X

答案 1 :(得分:2)

这使得功能不在整数类型中,并最小化效果的范围(根据您正在寻找的内容,这是好还是坏)。

此类别将从整数侧应用asType。

class IntegerCategory {
    static Object asType(Integer inty, Class c) {
        if(c == X) return new X(inty)
        else return inty.asType(c)
    }
}

use (IntegerCategory) { 
    (3 as X) instanceof X
}