Ответ 1
::
в Котлине идет метапрограммирование, включая ссылки на методы, ссылки на свойства и литералы классов. См. Обсуждение литератур класса.
Мы знаем, что double-colon (::
используется для получения ссылки на функцию (вызываемой) в 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
::
в Котлине идет метапрограммирование, включая ссылки на методы, ссылки на свойства и литералы классов. См. Обсуждение литератур класса.
В Котлине вы можете написать Object::class
, который даст вам KClass
. KClass не эквивалентен классу Class, который мы знаем из Java. Если вы хотите получить класс Java Class, вы можете написать Object::class.java
- ie: println("string"::class.java)
Также в java, .class
не является методом или членом - это специальная директива для компилятора для доступа к классу. Я думаю, что каждый язык выбирает синтаксис, который имеет для него наибольший смысл, и создатели kotlin решили использовать ::