6

これは重複している可能性がありますが、「as」はグーグルにとって信じられないほど難しいキーワードであり、SOでさえクエリの一部として「as」を無視します。

だから私は「as」を反射的にサポートするクラスをどのように実装するのか疑問に思っています。クラスの例:

クラスX{
    プライベートヴァル
    public X(def v){
        val = v
    }
    public asType(Class c){
        if(c == Integer.class)
            valを整数として返します
        if(c == String.class)
            valを文字列として返す
    }
}

これにより、次のようなことが可能になります。

new X(3) as String

動作するが、役に立たない:

3 as X

文字列と整数の「asType」をなんらかの方法でアタッチ/変更する必要がありますが、このような変更は「X」クラスに限定する必要があると思います...Xクラスは次のようなメソッドを実装できますか。

X fromObject(object)

または、X内からString / Integerクラスを変更します。Xが実際に使用されるまでXでコードを実行しないため、これは難しいようです...Xの最初の使用が「3asX」の場合、Xは次のようになります。 Groovyが呼び出そうとする前にIntegerのasTypeをオーバーライドするチャンスは?

4

2 に答える 2

6

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
于 2012-11-16T20:01:40.200 に答える
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
}
于 2012-11-16T20:33:18.793 に答える