将任何数据转换为Kotlin中的数组

我正在通过从Kotlin的Map<String, Any>加载数据来初始化一个类。 由于这张地图是直接从JSON收集的,我不确定是否存在任何给定的关键字,或者它的价值是我期望的类型。 为了安全地解开这个Map,我正在做以下工作,这看起来很完美:

 a = rawData["A"] as? String ?: "" 

这些数据中的一部分是进一步嵌套的JSON,我将其解包到数组中; 我试图以同样的方式做到这一点:

 b = rawData["B"] as? Array<String> ?: arrayOf<String>() 

但是,当我尝试使用数组(如上所述),IntelliJ踢了一个小题大做,说

警告:(111,30)Kotlin:不加限制的演员:任何? 到数组<String>

这只是IDE自身扭曲,还是这种方法真的不安全的阵列,尽管看起来是完全安全的其他类型?

我已经准备好调用这个bug了,因为Array是一个实体类型,意味着它的泛型参数实际上可以在运行时检查(例如不像List )。 我已经试过看看它是否已经提交,事实证明,编译器实际上是正确的告诉你一个警告。 正如你在这个问题的回答中所看到的那样,这种类型的演员仍然有一个可以忽略的问题。

 val a = arrayOf("foo", "bar", null) as Array<String> println(a[2].length) 

像这个例子中的数组成功地被转换(使用as ,它们不会抛出异常,使用as?它们不返回null ),但是转换不能确保这是一个Array<String> ,只是它是一个Array<String?>

这意味着您可以稍后从转换后类型为Array<String>的变量中读取null值,而不需要编译器提供进一步的警告。