为什么我有时可以在 Kotlin 中省略函数调用?

Why can I omit function invocations sometimes in Kotlin?

在下面的示例中,我有 2 个函数,返回 int。在一种情况下我不得不使用函数调用括号(),在另一种情况下我被禁止使用它

为什么以及如何控制?

package kotlin.tests

import java.util.ArrayList

object MyObject {
    fun getValue(): Int {
        return 0
    }
}


fun main() {

    val arrayList : ArrayList<Any> = ArrayList()

    println(arrayList.size())
    // Expression 'size' of type 'Int' cannot be invoked as a function. The function 'invoke()' is not found

    println(MyObject.getValue)
    // Function invocation 'getValue()' expected

}

size is a property on the List 接口,而不是函数。这就是为什么您可以(必须)不带括号访问它的原因。

出于某种原因,Kotlin 使用一些编译器魔法将 map its own collection types to the JVM types. They just decided to expose the size 集合作为 属性,并且每次您在 Kotlin 中使用集合时,即使它们的底层实现是 类 java.util.ArrayList,你通过 Kotlin 定义的接口看到它们。