Kotlin Android: как передать ArrayList из сериализуемых объектов через намерение без непроверенного предупреждения приведения? - PullRequest
0 голосов
/ 12 октября 2018

Я создаю Intent примерно так:

public void showThings(ArrayList<Thing> things) {
    Intent intent = new Intent(this, ThingActivity.class);
    intent.putExtra(THINGS, things);
    startActivity(intent);
}

Затем в ThingActivity я хочу получить ArrayList<Thing>

class ThingActivity {
   var things: ArrayList<Thing>? = null

   override fun onCreate(savedInstanceState: Bundle?) {
       things = intent.extras.getSerializable(OtherActivity.THINGS) as? ArrayList<Thing>
   }

К сожалению, я не могуКажется, не выясняется, как привести к соответствующему типу, не вызывая предупреждение «unchecked cast».Есть ли способ изящно установить значение null, если (как-то неожиданно) произойдет сбой приведения?

Добавление ?: return null, похоже, не работает, как я видел в других местах

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

В качестве альтернативы ответу Бен П, вы можете использовать Гсон .

Если предположить, что Things - это просто класс данных (содержит несколько переменных), это будет работать отлично(это также требуется ответом Бена П.).

Вот способ реализовать это:

public void showThings(ArrayList<Thing> things) {
    String json = new Gson().toJson(things);

    Intent intent = new Intent(this, ThingActivity.class);
    intent.putExtra(THINGS, json);
    startActivity(intent);
}

Тогда вы можете получить ArrayList следующим образом:

String json = intent.getStringExtra(THINGS);
TypeToken<ArrayList<Things>> token = new TypeToken<ArrayList<Things>>() {};
ArrayList<Things> things = new Gson().fromJson(json, token.getType());
0 голосов
/ 12 октября 2018

Непроверенное предупреждение о приведении происходит из-за того, как генерики Java работают во время выполнения.Из-за стирания типа во время выполнения тип списка просто List, а не List<Thing>.Это означает, что приведение считается небезопасным, даже если для человека вполне возможно взглянуть на код и увидеть, что проблем нет.

Хотя я согласен с вами, что подавление предупреждения не идеально, вв этом случае я думаю, что все в порядке.

Тем не менее, best решение будет заключаться в реализации интерфейса Parcelable на Thing.Таким образом, когда вы хотите передать List<Thing> через намерение, вы можете написать:

intent.putParcelableArrayListExtra(THINGS, things)

И когда вы хотите прочитать его обратно:

things = intent.extras.getParcelableArrayListExtra(OtherActivity.THINGS)

Ни один изэто вызовет предупреждение компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...