web-dev-qa-db-ja.com

なぜダブルコロン(::)を使用してKotlinでクラスを取得するのですか?

ダブルコロン(::)がKotlinの関数(呼び出し可能)参照を取得するために使用されることを知っています。 String::compareTo"string"::compareTo

JavaではSomeClass.classおよびsomeInstance.getClass()を使用してクラスを取得します。Kotlinではclassが関数/メソッドではないのにSomeClass::classおよびsomeInstance::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
26
fikr4n

Kotlinの::は、メソッド参照、プロパティ参照、クラスリテラルを含むメタプログラミングに関するものです。 クラスリテラルについての議論 を参照してください。

4
Miha_x64

Kotlinでは _Object::class_ と書くことができます。これにより KClass が得られます。 KClassは、Javaから知っているクラスClassと同等ではありません。 Java Classクラスを取得したい場合は、_Object::class.Java_を書くことができます-すなわち:println("string"::class.Java)

また、Javaでは、_.class_はメソッドでもメンバーでもありません。コンパイラーがクラスにアクセスするための特別なディレクティブです。各言語が最も意味のある構文を選択し、kotlinの作成者は_::_を使用することに決めたと思います

24
Lior Bar-On