繁体   English   中英

Kotlin Android:如何在没有未经检查的强制转换警告的情况下通过意图传递可序列化对象的 ArrayList?

Kotlin Android: How to pass ArrayList of Serializable objects through intent without unchecked cast warning?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在创建一个这样的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>
   }

不幸的是,我似乎无法弄清楚如何在不触发“未经检查的强制转换”警告的情况下转换为适当的类型。 如果(不知何故)强制转换失败,有没有办法优雅地设置为null

Appending ?: return null似乎不起作用,因为我在其他地方看到的建议

3 个回复

由于 Java 泛型在运行时的工作方式,会发生未经检查的强制转换警告。 由于类型擦除,在运行时,列表的类型只是List ,而不是List<Thing> 这意味着强制转换被认为是不安全的,即使人类很可能查看代码并发现没有问题。

虽然我同意您的观点,即抑制警告并不理想,但在这种情况下,我认为这很好。

不过,最好的解决方案是在Thing上实现Parcelable接口。 这样,当您想通过意图传递List<Thing> ,您可以编写:

intent.putParcelableArrayListExtra(THINGS, things)

当你想把它读回来时:

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

这些都不会导致编译器警告。

作为 Ben P 答案的替代方案,您可以使用Gson

假设Things只是一个数据类(包含一堆变量),这将完美运行(这也是 Ben P 的回答所要求的)。

这是实现它的一种方法:

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());

活动一:

val intent = Intent(this, SecondActivity::class.java)
val arrayGuide = ArrayList<Guide>()
intent.putParcelableArrayListExtra("arrayInfo",arrayGuide)
startActivity(intent)

活动二:

if(intent != null){
  val arrayList = 
  this.intent.getParcelableArrayListExtra<Guide>("arrayInfo")
}
3 Android通过意图传递ArrayList

我正在尝试将数据从一个屏幕传递到另一屏幕。 第一个屏幕从CSV读取数据,并将数据放入数据库表中。 任何无效的数据(例如年份中的字符串(整数))都会被捕获并存储在errorItem的ArrayList中,该列表包含Book标题,作者,日期,isbn,副本和标签。 我的程序已成功识别出无效的c ...

8 如何在没有注释的情况下序列化对象内的列表?

我有看起来像这样的 JSON(完整的 JSON 要大得多): 如何使用 ObjectMapper 将自定义序列化应用于collegeEducation ? 我不能使用注释JsonSerializer ,因为生成了 POJO,并且该库不提供应用该注释的方法。 所以我想对除列表之外的所有字段使用默认 ...

9 如何在没有某些属性名称的情况下序列化对象

我想生成以下json输出。我试图序列化对象但是从输出中看到“数据”数组没有json字符串名称,如果序列化它将属性名称添加到数组。 请为此建议一个解决方案并以通用方式对其进行优化。这是虚拟数据原始数据将是动态的。 我的代码: ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM