由于(GenericKeyedObjectPool<String, T>) ,以下代码将产生Unchecked cast警告。 从代码中可以看出,通配符( ? extends ConnectionBase )和通用类型( T extends ConnectionBase )是相 ...
提示:本站收集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
似乎不起作用,因为我在其他地方看到的建议
由于 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.