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

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

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

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

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

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

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

这只是IDE自身扭曲,还是这种方法真的是不安全的arrays,尽管对于其他types看起来是完全安全的?

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

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

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

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