Kotlin类文字与空的左侧尚不支持?

我想检查一个类型是否符合另一个类型的if表达式如下所示:

if (String::class is Any::class) 

这给了我空的左侧的错误类文字尚不支持。 任何人都可以详细说明这个错误和/或告诉我应该如何做这个检查?

编辑(澄清):我不能做平等检查,因为我需要知道左边的类是否匹配右边的类或者是它的子类。 所以如果左边的这个类的实例可以安全地转换到右边的类。

基本上我需要相当于:

 if ("A string" is Any) 

但没有一个字符串实例,字符串只是在这里使用一个例子。

你的错误信息是is检查需要一个类名,而不是对右边一个KClass的引用。 信息本身可能有点不清楚。 但在Java中也是如此,您不会使用instanceOf运算符,而是调用isAssignableFrom

为了帮助解决这个问题,你可以在Github中找到一些例子。

在Klutter库中有很多实例类型的检查, ClassKClassTypeKClass以及基元的组合。 你可以从那里复制想法。 从长远来看,您可能想要涵盖许多组合。

下面是一个扩展混合的例子,用于检查一个类型是否可以从另一个类型分配。 一些例子是:

 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 

查看所有排列的链接源 。

你将需要上述样本使用的这个erasedType()扩展 – 从一个Type返回一个Class (在类型擦除之后):

 @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.") } } 

我猜这是不清楚,如果Kotlin使用KClass和另一个KClass之间的is运算符不同,因为它在一个实例和一个类型之间做,这就是为什么我试图做的不工作。 无论如何,我做了这个小中缀函数来模仿功能。 但是,它只适用于JVM目标,因为它使用Java反射。 这是在这个SO职位上给出的答案 。

 infix fun <T : Any, C : Any> KClass<T>.can(comparate: KClass<C>) = comparate.java.isAssignableFrom(this.java) 

这将允许你做正是我想要做的,但与can函数而不是is运算符是这样的:

 if(String:class can Any::class)