我如何使用groovy的AS关键字
发布时间:2020-12-14 16:25:06 所属栏目:大数据 来源:网络整理
导读:这可能是重复的,但“as”是谷歌的一个难以置信的硬关键词,甚至是S.O.忽略“as”作为查询的一部分. 所以我想知道如何实现一个反复支持“as”的类.对于示例类: class X { private val public X(def v) { val=v } public asType(Class c) { if (c == Integer.c
这可能是重复的,但“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 我可能不得不以某种方式在String和Integer上附加/修改“asType”,但我觉得这样的任何更改都应该局限于“X”类…… X类是否可以实现如下方法: X fromObject(object) 或者以某种方式修改X中的String / Integer类.这看起来很难,因为在实际使用X之前它不会执行X中的任何代码…如果我第一次使用X是“3作为X”,那么X将得到在Groovy尝试调用之前有机会覆盖Integer的asType吗? 解决方法
正如您所说,将Integer的asType方法更改为接受X作为一种新类型的转换(特别是在不破坏现有功能的情况下)并不容易.
我能想到的最好的事情就是: Integer.metaClass.toX = { -> new X( delegate ) } 然后你可以打电话: 3.toX() 我无法想象如何做X可以做到 – 正如你所说,另一种方式;新的X(‘3’)作为整数相对容易. 实际上,你可以这样做: // 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |