kotlin тип переменной изменен во время выполнения - PullRequest
0 голосов
/ 31 марта 2020

У меня странная проблема в 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? или я что-то пропустил?

я использую kotlin 1.3.71 и jvm 1.8.

обновление 0:

image">

image()::class.java">

Assing section

1 Ответ

2 голосов
/ 31 марта 2020

Json не имеет разных типов чисел, поэтому по умолчанию все числа разбираются на двойные. Когда вы передаете ArrayList<Long> в fromJson(), Gson не может видеть тип <Long> из-за стирания типа. Когда вы передаете тип класса в библиотеку 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() }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...