Reputation: 3420
We know that double-colon (::
) is used to get function (callable) reference in Kotlin, e.g. String::compareTo
, "string"::compareTo
.
In Java we use SomeClass.class
and someInstance.getClass()
to get the class. Why in Kotlin we use SomeClass::class
and someInstance::class
while class
is not a 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
Upvotes: 53
Views: 29500
Reputation: 6363
::
in Kotlin is about meta-programming, including method references, property references and class literals.
See discussion about class literals.
Upvotes: 26
Reputation: 11480
In Kotlin you can write Object::class
, which will give you a KClass
. KClass is not equivalent to the class Class that we know from Java.
If you want to get the Java Class class you can write Object::class.java
- i.e.:
println("string"::class.java)
Also in java, .class
is not a method or a member - it is a special directive for the compiler to access the class.
I guess each language select the syntax that makes most sense for it, and kotlin's creators decided to use ::
Upvotes: 53