Intereting Posts
RxJava – Входы клавиатуры с обратным давлением? Можем ли мы представить «self class» в Java (или Kotlin)? Kotlin использует утверждения времени выполнения для проверки нуля – служебные накладные расходы? В чем разница между find и firstOrNull? Как создать бесконечный интервал Наблюдаемый, который будет генерировать новый объект каждый временной интервал? Идиоматический способ возврата, если не null в Котлин Kotlin: «если элемент не в списке» правильный синтаксис Облицовка проблем с реализацией Rx Java с архитектурой потока в kotlin android kotlin абстрактное статическое развлечение в сопутствующих объектах Kotlin Аннотация: Тип несоответствия: выведенный тип – java.lang.Class <foo>, но java.lang.Class <out jet.Annotation> ожидалось Работа с @Qualifier в функциях Котлина Функцию можно написать в Котлине (т.е. на верхнем уровне). Могу ли я также тестировать те, кто находится на верхнем уровне? Kotlin – Наследовать от Java-класса, который реализует Parcelable Применение преобразования к каждому элементу в Single <List <T >> Можно ли назвать операцию с кодом в Kotlin UNIT TEST

Kotlin: "val someVar = if (xx) 1 else 1.0", почему someVar является "Any"?

Во-первых, я попробовал:

interface Super class A : Super class B : Super val a = if (System.currentTimeMillis() >= 100) A() else B() 

Я нажал Ctrl Q чтобы проверить тип a . Это Super , как и ожидалось.

Но когда я попытался:

 val someVar = if (System.currentTimeMillis() > 0) 1 else 1.0 

В нем говорится, что someVar является Any . Разве это не Number ?

Причина в том, что ваши классы просто наследуются от одного интерфейса. Если вы посмотрите на Int и Double

 class Int : Number(), Comparable<Int> class Double : Number(), Comparable<Double> 

Поэтому нельзя определить, какой общий тип использовать.

В таких случаях вам нужно сделать тип явно

 val someVar: Number = ... 

Проблема заключается в следующем : и Double и Int являются подтипами Number и Comparable , т.е. имеют два разных супер-типа.

Если вы измените свой пример на следующий, ваша переменная также будет Any так как тогда A и B больше не только Super :

 interface Super class A : Super, Serializable class B : Super, Serializable //a is of type Any val a = if (System.currentTimeMillis() >= 100) A() else B() 

Вы можете явно объявить тип переменной, если хотите, чтобы она имела тип Number :

 val someVar: Number = if (System.currentTimeMillis() > 0) 1 else 1.0