0

这是我的场景,我有几个MutableList成员,第一个用于存储String(称为sl),其余用于Any(称为objectsnames,...),我需要通过 2 访问objectsnames和其余部分中的值方法:

  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"]

我一直在尝试为 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]
    }
}

不确定其他实现是否更适合我的场景,欢迎提出任何建议。

4

1 回答 1

1

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"]

细节

我想在这里指出几件事:

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

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

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

于 2020-04-08T22:44:05.653 回答