Kotlin: "val someVar = if (xx) 1 else 1.0", ¿por qué someVar es "Any"?

Primero, lo intenté:

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

Presioné Ctrl Q para verificar el tipo de a . Es Super , como se esperaba.

Pero cuando lo intenté:

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

Dice que someVar es un Any . ¿No debería ser un Number ?

La razón es porque tus classs simplemente henetworkingan de una sola interfaz. Si echas un vistazo a Int y Double

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

Por lo tanto, no se puede determinar qué tipo común usar.

En tales casos, debe hacer que el tipo sea explícito

 val someVar: Number = ... 

El problema es : tanto Double como Int son sub types de Number y Comparable , es decir, tienen dos types de súper diferentes.

Si cambias tu ejemplo a lo siguiente, tu variable también será Any ya que A y B ya no son solo 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() 

Podría declarar explícitamente el tipo de la variable si desea que sea del tipo Number :

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