7

KType 変数が null 許容の kotlin 型 (eG Int?) の値を保持しているかどうかをテストするにはどうすればよいですか?

私は持っている

var type: KType 

a からの変数でKProperty<*>.returnTypeあり、それが特定の kotlin タイプ (Int、Long など) と等しいかどうかを検出する必要があります。これは以下で動作します:

when (type) {
    Int::class.defaultType -> ...
    Long::class.defaultType -> ...
    else -> ...
}

しかし、これは null 非許容型に対してのみ機能するため、最初のブランチは Int に一致しませんか? ただし、タイプが Int であることを検出する方法をまだ理解できませんでしたか? それ以外は明らかですが、それほど良くありません

type.toString().equals("kotlin.Int?")
4

1 に答える 1

7

KType API ドキュメントからわかるように、そのインターフェースは完全にはほど遠いものです。現在、ほとんどすべての操作で、インスタンス.javaTypeで利用可能な拡張プロパティを使用して Java リフレクションに頼る必要がありKTypeます。(ちなみに、これは確実に Kotlin 1.1 で対処される予定です。)

あなたの場合、型がnull可能であり、そのJava型が必要なプリミティブクラスの型と等しいかどうかを確認する必要があります。

val isNullableInt = type.isMarkedNullable &&
                    type.javaType == Int::class.defaultType.javaType

ユースケースにより適した面白い回避策も提示できます。必要な型でプライベート関数を宣言し、リフレクションを使用して、実行時にその関数の戻り値の型と比較できます。

// Only return type of this function is used
fun _nullableInt(): Int? =
    TODO()  // Doesn't matter, it never gets called

...

val isNullableInt = type == ::_nullableInt.returnType
于 2016-03-11T17:57:06.037 に答える