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

最佳答案

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

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

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

intent.putParcelableArrayListExtra(THINGS, things)

而当您想读回去时:
things = intent.extras.getParcelableArrayListExtra(OtherActivity.THINGS)

这些都不会引起编译器警告。

08-18 01:45
查看更多