Kotlin – 覆盖/实现类似数组的访问器函数

是否可以重写或实现Kotlin中的[]访问器(使用操作符重载或类似操作)?

 val testObject = MyCustumObject() println(testObject["hi"]) // ie implement this accessor. 

在Python中,这可以通过实现__getitem____setitem__来实现。

3 Solutions collect form web for “Kotlin – 覆盖/实现类似数组的访问器函数”

在Kotlin中,需要实现的是getset运算符函数 :

 class C { operator fun get(s: String, x: Int) = s + x operator fun set(x: Int, y: Int, value: String) { println("Putting $value at [$x, $y]") } } 

用法:

 val c = C() val a = c["123", 4] // "1234" c[1, 2] = "abc" // Putting abc at [1, 2] 

你可以使用任意数量的参数定义getset (当然至少有一个)。 另外, set具有在作为其最后一个参数传递的使用站点上分配的表达式:

  • a[i_1, ..., i_n]被翻译成a.get(i_1, ..., i_n)

  • a[i_1, ..., i_n] = b被转换为a.set(i_1, ..., i_n, b)

getset也可以有不同的重载,例如:

 class MyOrderedMap<K, V> { // ... operator fun get(index: Int): Pair<K, V> = ... // i-th added mapping operator fun get(key: K): V = ... // value by key } 

注意:这个例子为MyOrderedMap<Int, SomeType>引入了不希望的歧义MyOrderedMap<Int, SomeType>因为两个get函数都会匹配像m[1]这样的调用。

正如文件中所述, a[i]被翻译为a.get(i) 。 例如:

 class MyObject { operator fun get(ix:Int):String{ return "hello $ix" } } 

让你写:

 val a = MyObject() println(a[123]) //-> "hello 123" 

类似地, a[i] = b被转换为一个方法调用a.set(i, b)

你必须重写get()。

https://kotlinlang.org/docs/reference/operator-overloading.html

 a[i] translates to a.get(i) 
  • 为什么getMessage()是一个Exception类的Kotlin未解决的引用?
  • Kotlin:覆盖子类型中的泛型属性
  • 如何禁用Android Kotlin中的点按钮
  • 配置kotlin插件更新失败?
  • 通过使用在超类中定义的相同名称的var来覆盖在接口中定义的val
  • Android kotlin onCreate(savedInstanceState:Bundle?)导致IllegalArgumentException
  • 在Android Kotlin中创建类扩展AsyncTask而不泄漏上下文对象
  • 如何使用界面android在适配器中创建onclick事件?
  • 保持Java中的BaseActivity与Kotlin Activity兼容
  • 使Intellij Idea插件与Kotlin文件一起工作
  • 在Kotlin中,如何在迭代时修改列表的内容
  • Kotlin language will be the best programming language for Android.