java - Kotlin 中 MutableList 成员的索引访问运算符重载
问题描述
这是我的场景,我有几个MutableList
成员,第一个用于存储String
(称为sl),其余用于Any
(称为objects,names,...),我需要通过 2 访问objects、names和其余部分中的值方法:
- sl通过索引,
- 对象、名称和其余部分通过存储在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"]
我一直在尝试为 a 重载索引访问运算符MutableList
,但出现此错误:
类型不匹配:推断类型为 String 但应为 Int
这是我迄今为止的尝试:
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;博士
如果你想从外部访问它们,那些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"]
细节
我想在这里指出几件事:
在类中声明的扩展函数只能在该类或其子类之一中访问,因此只有在内部
myStringList.objects["keyname"]
调用该运算符函数时,您仍然可以使用您的版本(例如)。StringList
我认为你应该处理 return 的情况
indexOf()
,-1
否则函数set
会get
抛出越界异常。如果可以,请考虑
Map<String, Any>
为您的用例使用简单的。
推荐阅读
- nginx - nginx路由wss和https流量,监听同一个端口
- r - 如何总结自定义 dplyr 函数中的变量列表?
- c++ - 为什么删除移动构造函数会导致编译错误?
- python - 为什么不启用 sqlite3 回调回溯
- database - 计算一组属性的闭包时如何处理组合实体类型
- mysql - 将子查询更改为 windows 功能
- c - 映射到 C 数据类型的 C 自定义数据类型分组在单个结构下
- python-3.x - 为什么“str(print(“hello”)+“one”)”在python中打印“hello noneone”?
- azure - 覆盖 Azure 中的现有 SSL 绑定
- jquery - 无法使用js重定向到新页面