Javaでは、のgetClass()
ように変数のクラスを解決できますsomething.getClass()
。Kotlinでは、something.javaClass
どちらが優れているかを認識していますがKClass
、同様の方法で取得できるようにしたいと考えています。Something::class
構文を見てきましたが、これは私が必要としているものではありません。変数のKClassを取得する必要があります。そのような機能は存在しますか?
回答:
Kotlin 1.1以降、これを実現する最も簡単な方法は、クラス参照構文です。
something::class
Kotlin 1.0を使用している場合は、.kotlin
拡張プロパティを呼び出すことで、取得したJavaクラスをKClassインスタンスに変換できます。
something.javaClass.kotlin
javap
)
KClass::class
して、現在のクラスオブジェクトを取得することもできます。
something::class
戻ってKClass<out Something>
しばらくsomething.javaClass.kotlin
戻っKClass<Something>
編集:以下のコメントと、上記のアレクサンダーからの回答を参照してください。このアドバイスは元々Kotlin1.0向けでしたが、現在は廃止されているようです。
この言語はまだこれを取得する直接的な方法をサポートしていないため、今のところ拡張メソッドを定義することを検討してください。
fun<T: Any> T.getClass(): KClass<T> {
return javaClass.kotlin
}
val test = 0
println("Kotlin type: ${test.getClass()}")
または、プロパティをご希望の場合:
val<T: Any> T.kClass: KClass<T>
get() = javaClass.kotlin
val test = 0
println("Kotlin type: ${test.kClass}")
java
:ビットを、まっすぐKotlinを行くfun<T: Any> T.getClass(): KClass<out T> = this::class
someClass::class
クラス名を取得するためのさまざまな実装を次に示します。要件に応じてご利用いただけます。
import kotlin.reflect.KClass
val <T : Any > T.kClassName: KClass<out T>
get() {
return javaClass.kotlin
}
ここで、kotlinでクラス名を取得できます
val <T : Any > T.classNameKotlin: String?
get() {
return javaClass.kotlin.simpleName
}
ここで、kotlinでクラス名を取得できます
val <T : Any > T.classNameJava: String
get() {
return javaClass.simpleName
}
以下の操作の出力は次のとおりです。
fun main(){
val userAge = 0
println(userAge.kClassName)
Output: class java.lang.Integer (Kotlin reflection is not available)
println(userAge.classNameKotlin)
Output: Int
println(userAge.classNameJava)
Output: Integer
}