Kotlin:在lambda中无法访问自动获取器

时间:2018-07-15 07:01:58

标签: kotlin

科特林应该自动创建吸气剂和吸气剂,但是...

class Foo {
  var id = 1
}

class Bar {
  var foos = listOf(Foo())

  fun printFooIds() {
    foos.forEach { println(it.id) }       // works
    foos.forEach { println(it.getId()) }  // error "Unresolved reference: getId"
  }
}

为什么会出错?我们如何在这里访问自动生成的吸气剂?

1 个答案:

答案 0 :(得分:3)

在Kotlin中写下foo.id(或it.id)时,您 通过其getter访问该属性,无论它是返回后备字段的默认属性还是您为其编写的自定义标签。

val id = foo.id   // this calls the getter
foo.id = 1        // this calls the setter

您看到的不是错误,您在编写Kotlin代码时应该使用foo.id来读取属性。


仅当从Kotlin访问Java属性时,才可以选择同时使用属性访问语法foo.idfoo.getId()读取属性。当然,第二个调用是原始的Java语法,第一个调用是Kotlin-to-Java interop feature,以使该语法更加与Kotlin友好。

类似地,对于Java-to-Kotlin互操作,您将看到该属性是Java的getter-setter对,并按如下方式使用它:

foo.getId()
foo.setId(1)