加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

我如何使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读