繁体   English   中英

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

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

我正在创建一个这样的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似乎不起作用,因为我在其他地方看到的建议

由于 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")
}

暂无
暂无

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

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