【问题标题】:Kotlin get type as stringKotlin 获取类型为字符串
【发布时间】:2015-12-17 12:49:37
【问题描述】:

我找不到如何使用 Kotlin 语言获取变量(或常量)的类型为 String,如 typeof(variable)。如何做到这一点?

【问题讨论】:

  • 你应该澄清你想用“变量的类型”做什么,例如如果检查“a 是 b 的实例”那么你不想要一个字符串。如果用于显示或其他用途,则可能是字符串。
  • 很简单:变量::类

标签: java kotlin


【解决方案1】:

您可以使用最适合您需求的方法之一:

val obj: Double = 5.0

System.out.println(obj.javaClass.name)                 // double
System.out.println(obj.javaClass.kotlin)               // class kotlin.Double
System.out.println(obj.javaClass.kotlin.qualifiedName) // kotlin.Double

你可以摆弄这个here

【讨论】:

  • 是的,我认为javaClass,正如其他 cmets 所述,是答案。
  • 这似乎不适用于可空类型。例如,如果您有 val obj = getInt(); 其中 getInt() 返回 Int? 类型,那么尝试 obj.javaClass.name 会导致编译错误
  • 如果您的属性可以为空,那么您当然必须运行obj?.javaClass?.name,它会为空值返回null
  • 如果你遇到kotlin.jvm.KotlinReflectionNotSupportedError: stackoverflow.com/a/36440329/5800527
  • 值得指出的是,这些名称可能会被混淆(ProGuard 和 R8)。
【解决方案2】:

有一种更简单的方法是使用 simpleName 属性并避免使用 Kotlin 前缀。

val lis = listOf(1,2,3)

lis 来自 ArrayList 类型。所以可以使用

println(lis.javaClass.kotlin.simpleName)  // ArrayList

或者,更优雅:

println(lis::class.simpleName)  // ArrayList 

【讨论】:

    【解决方案3】:

    您可以使用'::class' 关键字来指定实例的类型。 .simpleName 属性返回返回类的字符串名称。

    var variable = MyClass()
    
    var nameOfClass = variable::class.simpleName
    
    nameofClass >> "MyClass"
    

    【讨论】:

    • 写下你的答案。解释你的答案让 OP 更容易理解它。
    【解决方案4】:

    Type Checks and Casts: 'is' and 'as'

    if (obj is String) {
      print(obj.length)
    }
    
    if (obj !is String) { // same as !(obj is String)
      print("Not a String")
    }
    

    【讨论】:

    • 和@michael 的回答一样
    • @michael 用 Ja​​va 而非 Kotlin 回答。 Rodrigo 的这个答案是针对 Kotlin 的,不同之处在于 Kotlin 中不存在 instanceof,而是 is and !is operators
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 2012-08-04
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多