为什么在 Kotlin 中使用双冒号 (::) 获取 class?
Why getting class in Kotlin using double-colon (::)?
我们知道双冒号 (::
) 用于在 Kotlin 中获取函数(可调用)引用,例如String::compareTo
、"string"::compareTo
。
在Java中我们使用SomeClass.class
和someInstance.getClass()
得到class。为什么在 Kotlin 中我们使用 SomeClass::class
和 someInstance::class
而 class
不是 function/method?
println(String::compareTo)
// output: fun kotlin.String.compareTo(kotlin.String): kotlin.Int
println("string".compareTo("strong"))
// output: -6
println(String::class)
// output: class kotlin.String
println("string".class)
// compile error
在 Kotlin 中你可以写 Object::class
, which will give you a KClass
。 KClass不等同于我们从Java知道的classClass。
如果你想得到 Java Class class 你可以写 Object::class.java
- 即:
println("string"::class.java)
同样在 java 中,.class
不是方法或成员 - 它是编译器访问 class 的特殊指令。
我猜每种语言 select 最适合它的语法,kotlin 的创造者决定使用 ::
Kotlin中的::
是关于元编程的,包括方法引用、属性引用和class字面量。
参见 discussion about class literals。
我们知道双冒号 (::
) 用于在 Kotlin 中获取函数(可调用)引用,例如String::compareTo
、"string"::compareTo
。
在Java中我们使用SomeClass.class
和someInstance.getClass()
得到class。为什么在 Kotlin 中我们使用 SomeClass::class
和 someInstance::class
而 class
不是 function/method?
println(String::compareTo)
// output: fun kotlin.String.compareTo(kotlin.String): kotlin.Int
println("string".compareTo("strong"))
// output: -6
println(String::class)
// output: class kotlin.String
println("string".class)
// compile error
在 Kotlin 中你可以写 Object::class
, which will give you a KClass
。 KClass不等同于我们从Java知道的classClass。
如果你想得到 Java Class class 你可以写 Object::class.java
- 即:
println("string"::class.java)
同样在 java 中,.class
不是方法或成员 - 它是编译器访问 class 的特殊指令。
我猜每种语言 select 最适合它的语法,kotlin 的创造者决定使用 ::
::
是关于元编程的,包括方法引用、属性引用和class字面量。
参见 discussion about class literals。