我们知道双冒号(::
)用于获取Kotlin中的函数(可调用)引用,例如String::compareTo
,"string"::compareTo
。
在Java中,我们使用SomeClass.class
和someInstance.getClass()
来获取课程。为什么在Kotlin中我们使用SomeClass::class
和someInstance::class
而class
不是函数/方法?
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
答案 0 :(得分:24)
在Kotlin你可以写Object::class
,它会给你一个KClass
。 KClass不等同于我们从Java中知道的类Class。
如果你想获得Java Class类,你可以写Object::class.java
- 即:
println("string"::class.java)
同样在java中,.class
不是方法或成员 - 它是编译器访问类的特殊指令。
我想每种语言都选择最适合它的语法,而kotlin的创建者决定使用::
答案 1 :(得分:4)
::
是关于元编程的,包括方法引用,属性引用和类文字。
请参阅discussion about class literals。