let*_*rec 11 types type-inference intellij-idea kotlin
(我用Kotlin 1.1.2-2)
例如,我如何知道推断的表达式if (boolean_value) 1 else 2.0?kotlinc-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)
当将带有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中快速查看变量类型。