4

ほとんどの機能がネストされた Map デリゲート インスタンスに委譲されるカスタム Map のようなクラスを実装したいと考えています。そして、このクラスを「真の」Java クラスへのマップのように見せたいと思っています。したがって、私は次のことをしようとしました:

class ConfigurationMap implements Map {
    def inner = [:]

    def methodMissing(String methodName,methodArgs) {
        return inner.invokeMethod(methodName,methodArgs)
    }

    // my methods here
    ...

そしてもちろん、これは機能しません :-( Groovy は、実行時に MissMissing() によって処理されるにもかかわらず、クラスに Map インターフェイス メソッドを実装することを要求します。このimplements句を削除すると:

class ConfigurationMap {
    def inner = [:]

    def methodMissing(String methodName,methodArgs) {
        return inner.invokeMethod(methodName,methodArgs)
    }

Groovy では機能します (つまり、インスタンスは実際に Map のように動作します) が、Java コードから Map として使用することはできません。

ConfigurationMap cm = ConfigParser.parseConfig("foo.cfg");
assertEquals(0,cm.size()); // size() method is not defined :-(

また、クラスを短くして (つまり、Map を明示的に実装しないで)、クラスを Map to Java のように見せるにはどうすればよいかについてのアドバイスはありますか?

4

1 に答える 1

9

アノテーションを使えば@Delegate、コンパイルされたバイトコードが Java から正常に動作すると思います。

class ConfigurationMap implements Map {
    @Delegate Map inner = [:]

    def myMethod() {
        return true
    }
}

ConfigurationMap cm = new ConfigurationMap()
cm.foo = "bar"
assert "bar" == cm.foo
assert true == cm.myMethod()
于 2011-05-08T19:11:43.453 に答える