2017-06-24 22 views
4

(我使用Kotlin 1.1.2-2)我如何知道Kotlin中的推断类型?

例如,我如何知道表达式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 
        ^

回答

3

分配用Diff型结果,如果表达式的隐式原始变量时(而不类型定义变量),那么变量类型是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  

,但你可以与他们的超明确定义变量,例如:

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

// case 2 
val v:Int? = if (false) 1 else null; 

:您还可以使用CTRL+SHIFT+P/CTRL+Q迅速看到IDEA的变量类型。

+7

在IDEA中引入了类型提示,并在昨天发布了新的Kotlin v1.1.3。请参阅https://blog.jetbrains.com/kotlin/2017/06/kotlin-1-1-3-is-out/#more-5080 – marstran

+0

IDEA显示的类型与Kotlin编译器推断的类型相同?或只是插件计算的类型? IDEA显示“if(...)child1 else child2'不是”Any“的父类型。 – letrec

+0

@letrec现在你的kotlin的版本是什么?我的是'1.1.2-5'。 –