Литералы класса Kotlin с пустой левой стороной еще не поддерживаются?

Я пытаюсь проверить, соответствует ли тип другому типу с выражением if следующим образом:

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

Это дает мне литералы класса ошибок с пустой левой стороной, пока не поддерживаются. Может ли кто-нибудь уточнить эту ошибку и / или рассказать мне, как я должен делать эту проверку?

edit (уточнение): Я не могу выполнить проверку равенства, потому что мне нужно знать, соответствует ли класс слева или соответствует классу справа или является его подклассом. Поэтому, если экземпляр класса слева можно безопасно применить к классу справа.

В принципе мне нужен эквивалент:

 if ("A string" is Any) 

Но без экземпляра String String просто используется здесь.

Ваше сообщение об ошибке состоит в том, что проверка проверяет имя класса, а не ссылку на KClass с правой стороны. Само сообщение может быть немного неясным. Но то же самое относится и к Java, вы бы не использовали оператор instanceOf а вместо этого вызывали isAssignableFrom .

Для получения помощи по решению проблемы у вас есть примеры, которые можно найти в Github …

В библиотеке Klutter есть примеры множества комбинаций проверки стиля instanceOf между Class , KClass , Type и KType а также примитивами. Вы можете копировать идеи оттуда. Есть много комбинаций, которые вы, возможно, захотите охватить в долгосрочной перспективе.

Вот выборка большого набора расширений для проверки того, можно ли назначить один тип из другого. Несколько примеров:

 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 оператор is по-разному между KClass и другим KClass, как это происходит между экземпляром и типом, поэтому то, что я пытаюсь сделать, не работает. В любом случае я сделал эту маленькую функцию infix, чтобы имитировать функциональность. Однако он работает только с целью JVM, так как использует Java-отражение. Это уходит от ответа, данного в этой публикации .

 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)