【问题标题】:How do I know inferred type in Kotlin?我如何知道 Kotlin 中的推断类型?
【发布时间】:2017-11-27 16:46:48
【问题描述】:

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

【问题讨论】:

    标签: intellij-idea types kotlin type-inference


    【解决方案1】:

    当将具有 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中快速查看变量类型。

    【讨论】:

    • 在昨天发布的新 Kotlin v1.1.3 中,IDEA 中引入了类型提示。见blog.jetbrains.com/kotlin/2017/06/kotlin-1-1-3-is-out/…
    • IDEA 显示的类型与 Kotlin 编译器推断的类型相同?还是只是插件计算的类型? IDEA 显示 if (...) child1 else child2 而不是 Any 的父类型。
    • @letrec 你的 kotlin 现在是什么版本?我的是1.1.2-5
    • @holi-java 我使用 IDEA 2017.1.4 构建 IC-171.4694.23 + Kotlin 插件 1.1.2。类是open class MyBoolclass MyTrue : MyBool()class MyFalse : MyBool()
    • 我想你们会喜欢这个的:stackoverflow.com/questions/54851861/…
    【解决方案2】:

    我想你的意思是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

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2020-12-30
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2018-05-15
      相关资源
      最近更新 更多