例如,LibGDX框架具有自定义集合类,例如Array<T>
和ObjectMap<K, V>
,可以帮助实现应用/游戏性能。是否可以创建文字初始值设定项,以便Array
可以使用[1,2,3,4]
进行初始化,ObjectMap
使用[key:"value"]
进行初始化。
我知道可以通过实现[]
/ putAt
方法将访问运算符getAt
添加到对象中,但是没有看到任何关于文字初始值设定项的内容。
它们是否被锁定为语言本身,就像运算符覆盖在Java中一样,或者有没有办法为自定义类创建列表/映射初始值设定项?
答案 0 :(得分:3)
一种可能的方法是操纵现有的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; - )