java - Kotlin 中 MutableList 成员的索引访问运算符重载

标签 java kotlin operator-overloading mutablelist

这是我的场景,我有几个 MutableList 成员,第一个用于存储 String (称为 sl),其余的用于 任何(称为对象名称,...),我需要访问对象中的值,< strong>名称和其余的通过两种方式:

  1. sl 通过索引,
  2. 对象名称,其余通过存储在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"]

详细信息

有几件事我想在这里指出:

  1. 在类内部声明的扩展函数只能在该类或其子类之一中访问,因此仅当您满足以下条件时,您仍然可以使用您的版本(例如 myStringList.objects["keyname"] ) 内部调用该运算符函数 StringList .

  2. 我认为你应该处理 indexOf() 的情况。返回-1 ,否则函数 setget会抛出越界异常。

  3. 如果可以的话,请考虑使用简单的 Map<String, Any>适用于您的用例。

关于java - Kotlin 中 MutableList 成员的索引访问运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61110952/

相关文章:

java - "Mutually Comparable"是什么意思?

java - 找不到枚举时的枚举类映射问题

c++ - 运算符重载删除函数

F# 在类上实现列表 [] 运算符?

java - jasper 报告从 jasper 加载报告

java - 在Swing中对齐垂直和水平顺序组

Java:WatchService 在复制内容之前收到通知

kotlin - Vertx和Kotlin协程永远挂起

android - 如何从 tess-two 中正确提取 text 和 boxRects?

c++ - 重载括号运算符赋值