2017-06-24 23 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'。 –