为什么我有时可以在 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 定义的接口看到它们。
在下面的示例中,我有 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 定义的接口看到它们。