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

时间:2017-06-24 04:20:52

标签: intellij-idea types kotlin type-inference

(我使用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
                       ^

2 个答案:

答案 0 :(得分:4)

将具有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     

但您可以使用超类明确定义变量,例如:

// 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中快速查看变量类型。

答案 1 :(得分:0)

我认为您的意思是https://stackoverflow.com/a/45165263

您可以使用is运算符检查对象是否为特定类型:

val number = 5
if(number is Int) {
   println("number is of type Int")
}

您还可以使用反射将类型设为String

println("${number::class.simpleName}")    // "Int"
println("${number::class.qualifiedName}") // "kotlin.Int"

请注意:

在Java平台上,使用 反射功能作为单独的JAR文件分发 (kotlin-reflect.jar)。这样做是为了减小所需的 不使用反射功能的应用程序的运行时库。 如果您确实使用反射,请确保添加了.jar文件 到项目的类路径。

来源:https://kotlinlang.org/docs/reference/reflection.html#bound-class-references-since-11