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

Collections 是否可以在Groovy中为自定义类实现集合文字初始值设定项?,collections,groovy,literals,Collections,Groovy,Literals,例如,LibGDX框架具有定制的集合类,如Array和ObjectMap,它们有助于提高应用程序/游戏的性能。是否可以创建一个文本初始值设定项,以便可以使用例如[1,2,3,4]和ObjectMap使用[key:“value”]初始化数组 我知道可以通过实现putAt/getAt方法将访问操作符[]添加到对象中,但还没有看到关于文本初始值设定项的任何内容 它们是像Java中的运算符重写一样被锁定在语言本身中,还是有办法为自定义类创建列表/映射初始值设定项?一种可能的方法是操纵现有的LinkedH

例如,LibGDX框架具有定制的集合类,如
Array
ObjectMap
,它们有助于提高应用程序/游戏的性能。是否可以创建一个文本初始值设定项,以便可以使用例如
[1,2,3,4]
ObjectMap
使用
[key:“value”]
初始化
数组

我知道可以通过实现
putAt
/
getAt
方法将访问操作符
[]
添加到对象中,但还没有看到关于文本初始值设定项的任何内容


它们是像Java中的运算符重写一样被锁定在语言本身中,还是有办法为自定义类创建列表/映射初始值设定项?

一种可能的方法是操纵现有的
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
另一个选项是向基本
Map
元类添加方法
toObjectMap()
,如下所示:

Map.getMetaClass().toObjectMap = { ->
    def map = new ObjectMap()
    delegate.each { key, value -> map.put(key, value) }
    map
}
然后,您可以执行以下操作:

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

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

一种可能的方法是操作现有的
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
另一个选项是向基本
Map
元类添加方法
toObjectMap()
,如下所示:

Map.getMetaClass().toObjectMap = { ->
    def map = new ObjectMap()
    delegate.each { key, value -> map.put(key, value) }
    map
}
然后,您可以执行以下操作:

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

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

一种可能的方法是操作现有的
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
另一个选项是向基本
Map
元类添加方法
toObjectMap()
,如下所示:

Map.getMetaClass().toObjectMap = { ->
    def map = new ObjectMap()
    delegate.each { key, value -> map.put(key, value) }
    map
}
然后,您可以执行以下操作:

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

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

一种可能的方法是操作现有的
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
另一个选项是向基本
Map
元类添加方法
toObjectMap()
,如下所示:

Map.getMetaClass().toObjectMap = { ->
    def map = new ObjectMap()
    delegate.each { key, value -> map.put(key, value) }
    map
}
然后,您可以执行以下操作:

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


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

你能举个例子说明你的意思吗?我想OP想从
[x:42]
之类的东西中获取ObjectMap,而不是
LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用
消除一些重复。作为ObjectMap的
[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于
ObjectMap
是如何实现的。。。当我有机会的时候我会看一看你能举个例子说明你的意思吗?我想OP想从
[x:42]
之类的东西而不是
LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用
消除一些重复。作为ObjectMap的
[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于
ObjectMap
是如何实现的。。。当我有机会的时候我会看一看你能举个例子说明你的意思吗?我想OP想从
[x:42]
之类的东西而不是
LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用
消除一些重复。作为ObjectMap的
[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于
ObjectMap
是如何实现的。。。当我有机会的时候我会看一看你能举个例子说明你的意思吗?我想OP想从
[x:42]
之类的东西而不是
LinkedHashMap
(我猜这是不可能的)@MrPlow您至少可以使用
消除一些重复。作为ObjectMap的
[x:42]会不会不起作用?@tim_yates通过在LinkedHashMap上为它添加一个asType?取决于
ObjectMap
是如何实现的。。。等我有机会再看一看。尽管这样做的缺点是总有两次分配。一个用于临时LinkedHashMap(很快就会离开作用域并标记为GC),另一个用于ObjectMap。我想这是我必须接受的(我并不是每次都使用文字贴图)。谢谢你的回答。易用性总是要付出代价的;-)以延伸蒂姆的回答。如果该类提供了一个构造函数,其中列表的每个元素都适合该构造函数(例如使用Object[]/Object…),则类似于
ObjectMap map2=[1,2,3]
的行将起作用。这仍然会创建一个中间LinkedHashMap,但Groovy的未来版本可能会在此基础上进行优化。尽管这样做的缺点是总有两次分配。一个用于临时LinkedHashMap(很快就会离开作用域并标记为GC),另一个用于ObjectMap。我想这是我必须接受的(我并不是每次都使用文字贴图)。谢谢你的回答。易用性总是要付出代价的;-)以延伸蒂姆的回答。如果该类提供了一个构造函数,其中列表的每个元素都适合该构造函数(例如使用Object[]/Object…),则类似于
ObjectMap map2=[1,2,3]
的行将起作用。这仍然会创建一个中间LinkedHashMap,但Groovy的未来版本可能会在此基础上进行优化。尽管这样做的缺点是总有两次分配。一个用于临时LinkedHashMap(很快就会离开作用域并标记为GC),另一个用于ObjectMap。我想这是我必须接受的(我并不是每次都使用文字贴图)。谢谢你的回答。易用性总是要付出代价的;-)以延伸蒂姆的回答。如果类提供构造函数