是否可以在 Groovy 中为自定义 类 实现集合字面值初始值设定项?

Is it possible to implement collection literal initializers for custom classes in Groovy?

例如 LibGDX 框架有定制的集合 类,例如 Array<T>ObjectMap<K, V>,它们有助于 app/game 性能。是否可以创建一个文字初始化程序,以便可以使用 [1,2,3,4]ObjectMap 以及 [key:"value"].

等来初始化 Array

我知道可以通过实现 putAt/getAt 方法将访问运算符 [] 添加到对象中,但还没有看到有关文字初始化程序的任何内容。

它们是否像 Java 中的运算符覆盖一样锁定在语言本身中,或者是否有办法为自定义 类 创建 list/map 初始化程序?

一种可能的方法是操纵现有的 LinkedHashMap.asType() 方法以接受 ObjectMap 作为参数:

def originalMethod = LinkedHashMap.getMetaClass().getMetaMethod("asType", Class)
LinkedHashMap.getMetaClass().asType = { Class clazz ->
    if(clazz == ObjectMap) {
        def map = new ObjectMap()
        delegate.each { key, value -> map.put(key, value) }
        map
    }
    else {
        originalMethod.invoke(delegate, clazz)
    }
}

然后你可以这样做:

def map = [a:1] as ObjectMap

另一种选择是将方法 toObjectMap() 添加到基础 Map 元类中,如下所示:

Map.getMetaClass().toObjectMap = { ->
    def map = new ObjectMap()
    delegate.each { key, value -> map.put(key, value) }
    map
}

那么,你可以这样做:

def map2 = [a:2].toObjectMap()

或者,只需编写一个实用方法将 Maps 转换为 ObjectMaps ;-)