【问题标题】:Indexed access operator overload for a MutableList member in KotlinKotlin 中 MutableList 成员的索引访问运算符重载
【发布时间】:2020-04-08 22:18:37
【问题描述】:

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

  1. sl 通过索引,
  2. objectsnames 其余通过sl
  3. 中存储的字符串值

也许举个例子更清楚:

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 重载索引访问运算符,但我收到此错误:

类型不匹配:推断类型为 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]
    }
}

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

【问题讨论】:

  • 使用地图或配对列表不是更简单吗?
  • @Tenfour04 谢谢你的想法,但我的解释不完整,我需要处理其他列表,我已经编辑了问题。

标签: java kotlin operator-overloading mutablelist


【解决方案1】:

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. inside 类声明的扩展函数只能在该类或其子类之一中访问,因此您仍然可以使用您的版本(例如 myStringList.objects["keyname"]inside StringList 调用该运算符函数。

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

  3. 如果可以,请考虑为您的用例使用简单的Map&lt;String, Any&gt;

【讨论】:

  • 感谢您的回答,但我的问题不完整,我已经编辑了问题。
  • @AlejandroMontilla 我看到了。这是多个Map&lt;String, Any?&gt; 的完美用例。为什么你不能呢?
  • 非常感谢@GiorgioAntonioli,我做到了……现在我有一个mutableListOf&lt;String&gt; 用于索引访问,还有几个mutableMapOf&lt;String, Any?&gt;() 用于存储我的对象。
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多