Kotlin:"val someVar = if(xx)1 else 1.0",为什么someVar是"Any"?

ice*_*000 3 inheritance types casting kotlin

首先,我试过:

interface Super
class A : Super
class B : Super

val a = if (System.currentTimeMillis() >= 100) A() else B()
Run Code Online (Sandbox Code Playgroud)

我按下Ctrl Q检查的类型a.它的Super,符合市场预期.

但当我尝试时:

val someVar = if (System.currentTimeMillis() > 0) 1 else 1.0
Run Code Online (Sandbox Code Playgroud)

它说someVar是一个Any.不应该是一个Number

s1m*_*nw1 5

问题是:这两个DoubleInt是子类型的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()
Run Code Online (Sandbox Code Playgroud)

如果您希望变量类型,则可以显式声明变量的类型Number:

val someVar: Number = if (System.currentTimeMillis() > 0) 1 else 1.0
Run Code Online (Sandbox Code Playgroud)