あなたのエラーメッセージがis
チェックが期待されていることクラス名であり、右側のKClassへの参照ではありません。メッセージ自体は少し不明かもしれません。しかし、Javaでも同じことが言えますが、instanceOf
演算子は使用せず、代わりにisAssignableFrom
を呼び出します。
問題を解決するためのヘルプについては、あなたはGitHubの中に見つけることができる例を持っている... Klutter libraryで
はClass
、KClass
、Type
とKType
などの間INSTANCEOFスタイルチェックの組み合わせの多くの例であり、プリミティブと同じように。そこからアイデアをコピーすることができます。あなたが長期的にカバーしたかったかもしれない多くの組み合わせがあります。
ここでは、一方のタイプが他方から割り当て可能かどうかをチェックするためのa big mix of extensionsのサンプリングがあります。いくつかの例があります:
fun <T : Any, O : Any> KClass<T>.isAssignableFrom(other: KClass<O>): Boolean {
if (this.java == other.java) return true
return this.java.isAssignableFrom(other.java)
}
fun <T : Any> KClass<T>.isAssignableFrom(other: Class<*>): Boolean {
if (this.java == other) return true
return this.java.isAssignableFrom(other)
}
fun KClass<*>.isAssignableFromOrSamePrimitive(other: KType): Boolean {
return (this.java as Type).isAssignableFromOrSamePrimitive(other.javaType)
}
fun KClass<*>.isAssignableFromOrSamePrimitive(other: Type): Boolean {
return (this.java as Type).isAssignableFromOrSamePrimitive(other)
}
fun Type.isAssignableFromOrSamePrimitive(other: Type): Boolean {
if (this == other) return true
if (this is Class<*>) {
if (other is Class<*>) {
return this == other.kotlin.javaObjectType || this == other.kotlin.javaPrimitiveType ||
this.isAssignableFrom(other)
}
return this.isAssignableFrom(other.erasedType())
}
return this.erasedType().isAssignableFrom(other.erasedType())
}
// ... and so on for every permutation of types
linked source for all permutationsを参照してください。
そして、あなたは上記のサンプルで使用されるこのerasedType()
extensionが必要になります - (型消去後)バックClass
からType
から行きた:私の同僚はKotlinが持っていると言い、別のSOのポストを見つけ
@Suppress("UNCHECKED_CAST") fun Type.erasedType(): Class<Any> {
return when (this) {
is Class<*> -> this as Class<Any>
is ParameterizedType -> this.getRawType().erasedType()
is GenericArrayType -> {
// getting the array type is a bit trickier
val elementType = this.getGenericComponentType().erasedType()
val testArray = java.lang.reflect.Array.newInstance(elementType, 0)
testArray.javaClass
}
is TypeVariable<*> -> {
// not sure yet
throw IllegalStateException("Not sure what to do here yet")
}
is WildcardType -> {
this.getUpperBounds()[0].erasedType()
}
else -> throw IllegalStateException("Should not get here.")
}
}
これを行う方法はなく、唯一の方法はJavaリフレクションを使用することです(JVMをターゲットにしていると仮定します)。 http://stackoverflow.com/questions/35851719/how-to-compare-classes-and-interfaces/35852445#35852445 – zjuhasz