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