4

我想实现一个自定义的类 Map 类,其中大部分功能都委托给嵌套的 Map 委托实例。而且,我希望这个类看起来像一个映射到一个“真正的”Java 类。因此,我尝试执行以下操作:

class ConfigurationMap implements Map {
    def inner = [:]

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

    // my methods here
    ...

当然,这不起作用 :-( Groovy 要求类实现 Map 接口方法,尽管在运行时它们将由 MissingMissing() 处理。如果我删除该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 回答