kotlin 变量类型在运行时改变

kotlin variable type changed in runtime

我在 android 和 kotlin 中遇到了奇怪的问题。 问题是我用 ArrayList<Long> 类型定义变量,但在运行时更改为 ArrayList<Double>

我这样定义我的变量:

private var mDivideEntityValue: ArrayList<Long> = arrayListOf()

并使用 Gson 库来赋值,例如:

// mDivideEntity is string variable store in json array like: ["150","30"]
mDivideEntityValue = Gson().fromJson(mDivideEntity.amounts, ArrayList<Long>()::class.java)

分配 ArrayList<Long> 后更改为 ArrayList<Double>

这是科特林错误吗?或者我想念什么?

我使用 kotlin 1.3.71 和 jvm 1.8。

更新 0:

Json 没有不同的数字类型,因此默认情况下,所有数字都被解析为双精度。当你将 ArrayList<Long> 传递给 fromJson() 时,由于类型擦除,Gson 看不到 <Long> 类型。当您将 class 类型传递给 Java 库时,您也可以使用 <*> 作为类型。

Kotlin 让返回的 ArrayList<Double> 分配给您的 ArrayList<Long> 属性 因为在运行时它无法区分(类型擦除)。

但是,数组确实有具体化的类型。这可能有效(未测试):

val divideEntityValue = Gson().fromJson(mDivideEntity.amounts, LongArray::class.java)

这将为您提供 LongArray 而不是 ArrayList。或者,您应该能够将返回的列表映射到列表:

mDivideEntityValue = Gson().fromJson(mDivideEntity.amounts, ArrayList::class.java)
    .map { it.toLong() }