我怎么知道Kotlin的推断类型?

let*_*rec 11 types type-inference intellij-idea kotlin

(我用Kotlin 1.1.2-2)

例如,我如何知道推断的表达式if (boolean_value) 1 else 2.0kotlinc-jvm没有显示类型.javaClass也没有帮助,因为它显示计算值的类型而不是表达式.

>>> (if (true) 1 else 2.0).javaClass.name
java.lang.Integer
>>> (if (false) 1 else 2.0).javaClass.name
java.lang.Double
>>> val v: Double = if (false) 1 else 2.0
error: the integer literal does not conform to the expected type Double
val v: Double = if (false) 1 else 2.0
                       ^
Run Code Online (Sandbox Code Playgroud)

hol*_*ava 5

当将带有diff类型结果的if表达式赋给一个隐含的基本变量(没有类型定义的变量)时,变量类型为Any/ T?或一个具有直接晚餐类的隐含变量P。例如:

// case 1
val v = if (false) 1 else 2.0
//  ^--- Any
v.toInt(); // error because v is Any

// case 2
val v = if (false) 1 else null
//  ^--- Int?

// case 3
val e = if (true) java.sql.Time(1) else java.sql.Timestamp(1);
//  ^--- its type is java.util.Date     
Run Code Online (Sandbox Code Playgroud)

但是您可以使用其超类显式定义变量,例如:

// case 1
val v:Number = if (false) 1 else 2.0;
v.toInt();//ok 

// case 2
val v:Int? = if (false) 1 else null;
Run Code Online (Sandbox Code Playgroud)

注意:您也可以使用CTRL+SHIFT+P/ CTRL+Q在IDEA中快速查看变量类型。

  • 昨天发布的新Kotlin v1.1.3在IDEA中引入了类型提示。参见https://blog.jetbrains.com/kotlin/2017/06/kotlin-1-1-3-is-out/#more-5080 (11认同)