Los literales de class Kotlin con el lado izquierdo vacío aún no son compatibles.

Estoy tratando de verificar si un tipo se ajusta a otro tipo con una expresión if como esta:

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

Esto me da los literales de class de error con el lado izquierdo vacío aún no son compatibles. ¿Alguien puede explicar ese error y / o decirme cómo debería hacer este control?

editar (aclaración): No puedo hacer una verificación de igualdad porque necesito saber si la class de la izquierda coincide con la class de la derecha o si es una subclass de la misma. Entonces, si una instancia de la class de la izquierda se puede transmitir de manera segura a la class de la derecha.

Básicamente, necesito el equivalente de:

 if ("A string" is Any) 

Pero sin tener una instancia de String, String solo se usa como ejemplo aquí.

    Su post de error es que el cheque is espera un nombre de class y no una reference a un KClass en el lado derecho. El post en sí podría ser un poco confuso. Pero lo mismo se aplica en Java, no usaría el operador instanceOf , sino que llamaría isAssignableFrom .

    Para get ayuda para resolver el problema, tiene ejemplos que se pueden encontrar en Github …

    En la biblioteca Klutter hay ejemplos de muchas combinaciones de comprobación de estilo instanceOf entre Class , KClass , Type y KType , así como primitivas. Puede copyr ideas desde allí. Hay muchas combinaciones que podría querer cubrir a largo ploop.

    Aquí hay una muestra de una gran combinación de extensiones para verificar si un tipo es asignable del otro. Algunos ejemplos son:

     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 

    Ver la fuente vinculada para todas las permutaciones .

    Y necesitará esta extensión erasedType() utilizada por las muestras anteriores, que va desde un Type Volver a una Class (después del borrado de tipo):

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

    Supongo que no estaría claro si Kotlin usó el operador is de forma diferente entre una KClass y otra KClass, como lo hace entre una instancia y un tipo, y por eso lo que estaba tratando de hacer no funciona. De todos modos, hice esta pequeña function infija para imitar la funcionalidad. Sin embargo, solo funciona con el objective de JVM, ya que utiliza la reflexión de Java. Esto está saliendo de la respuesta dada en esta publicación SO .

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

    Esto te permitirá hacer exactamente lo que yo estaba tratando de hacer, pero con la function can en lugar del operador is como esta:

     if(String:class can Any::class)