interface - 如何使 Groovy 类看起来像 Map 到 Java 代码而不显式实现 Map 接口(interface)

标签 interface groovy missingmethod

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

class ConfigurationMap implements Map {
    def inner = [:]

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

    // my methods here
    ...

当然,这是行不通的:-( Groovy 要求类实现 Map 接口(interface)方法,尽管在运行时它们将由 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?

最佳答案

我认为如果您使用@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()

关于interface - 如何使 Groovy 类看起来像 Map 到 Java 代码而不显式实现 Map 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928203/

相关文章:

c# - 如何为实现接口(interface)的每个对象设置属性的默认值?

grails - Clojure 1.2.1/1.3/1.4 '在 Grails 2.0.0 运行时生成的代理失败。 1.2.0就可以了

spring - GORM无法从JAR引导

Groovy 从 map 中删除空元素

java - JSONObject keySet() 函数不存在吗?

struct - 在结构或接口(interface)内部执行计算?

html - 如何向 Firefox 工具栏添加一个看起来合适的文本输入字段?

Java - 用不同的方法实现两个接口(interface)