Kotlin 中 MutableList 成员的索引访问运算符重载
Indexed access operator overload for a MutableList member in Kotlin
这是我的场景,我有几个 MutableList
成员,第一个用于存储 String
(称为 sl),其余的用于 [=14] =](称为 objects、names、...),我需要访问 objects, names 其余通过两种方式:
- sl通过索引,
- objects, names 其余通过字符串值存储在 sl,
也许举个例子更清楚:
var tmpListItem = myStringList.sl[0] // read only for the sl list
myStringList.objects["keyname"] = "keyvalue" // write and read for the rest
var tmpObj = myStringList.objects["keyname"]
myStringList.names["keyname"] = "keyvalue"
var tmpName = myStringList.names["keyname"]
我一直在尝试为 MutableList
重载索引访问运算符,但出现此错误:
Type mismatch: inferred type is String but Int was expected
这是我目前的尝试:
data class StringList(val str: String) {
val sl = mutableListOf<String>()
val objects = mutableListOf<Any?>()
val names = mutableListOf<Any?>()
val values = mutableListOf<Any?>()
val strings = mutableListOf<Any?>()
public operator fun <E> MutableList<E>.set(k: String, value: Any?) {
val t = sl.indexOf(k)
objects[t] = value
}
operator fun <E> MutableList<E>.get(e: String): Any? {
val t = sl.indexOf(e)
return objects[t]
}
}
不确定其他实现是否更适合我的场景,欢迎提出任何建议。
TL;DR
如果你想从外部访问它们,那些 operator fun
不应该是 MutableList
的扩展。
data class StringList(val str: String) {
val sl = mutableListOf<String>()
val objects = mutableListOf<Any?>()
operator fun set(k: String, value: Any?) {
val t = sl.indexOf(k)
objects[t] = value
}
operator fun get(e: String): Any? {
val t = sl.indexOf(e)
return objects[t]
}
}
现在您可以像这样使用它们了:
myStringList["keyname"] = "keyvalue"
var tmp = myStringList["keyname"]
详情
这里有几点我想指出:
在内部声明的扩展函数只能在class或其子[=53]之一中访问=]es,因此只有在调用运算符函数 inside StringList
.
[ 时,您仍然可以使用您的版本(例如 myStringList.objects["keyname"]
) =49=]
我认为你应该处理 indexOf()
returns -1
的情况,否则函数 set
和 get
将抛出越界异常。
如果可以,请考虑为您的用例使用简单的 Map<String, Any>
。
这是我的场景,我有几个 MutableList
成员,第一个用于存储 String
(称为 sl),其余的用于 [=14] =](称为 objects、names、...),我需要访问 objects, names 其余通过两种方式:
- sl通过索引,
- objects, names 其余通过字符串值存储在 sl,
也许举个例子更清楚:
var tmpListItem = myStringList.sl[0] // read only for the sl list
myStringList.objects["keyname"] = "keyvalue" // write and read for the rest
var tmpObj = myStringList.objects["keyname"]
myStringList.names["keyname"] = "keyvalue"
var tmpName = myStringList.names["keyname"]
我一直在尝试为 MutableList
重载索引访问运算符,但出现此错误:
Type mismatch: inferred type is String but Int was expected
这是我目前的尝试:
data class StringList(val str: String) {
val sl = mutableListOf<String>()
val objects = mutableListOf<Any?>()
val names = mutableListOf<Any?>()
val values = mutableListOf<Any?>()
val strings = mutableListOf<Any?>()
public operator fun <E> MutableList<E>.set(k: String, value: Any?) {
val t = sl.indexOf(k)
objects[t] = value
}
operator fun <E> MutableList<E>.get(e: String): Any? {
val t = sl.indexOf(e)
return objects[t]
}
}
不确定其他实现是否更适合我的场景,欢迎提出任何建议。
TL;DR
如果你想从外部访问它们,那些 operator fun
不应该是 MutableList
的扩展。
data class StringList(val str: String) {
val sl = mutableListOf<String>()
val objects = mutableListOf<Any?>()
operator fun set(k: String, value: Any?) {
val t = sl.indexOf(k)
objects[t] = value
}
operator fun get(e: String): Any? {
val t = sl.indexOf(e)
return objects[t]
}
}
现在您可以像这样使用它们了:
myStringList["keyname"] = "keyvalue"
var tmp = myStringList["keyname"]
详情
这里有几点我想指出:
在内部声明的扩展函数只能在class或其子[=53]之一中访问=]es,因此只有在调用运算符函数 inside
[ 时,您仍然可以使用您的版本(例如StringList
.myStringList.objects["keyname"]
) =49=]我认为你应该处理
indexOf()
returns-1
的情况,否则函数set
和get
将抛出越界异常。如果可以,请考虑为您的用例使用简单的
Map<String, Any>
。