这可能是重复但是" 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?
答案 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
}