Kotlin 中, Intent 传递 Map 遇到 Unchecked cast 问题

2020-12-25 17:55:04 +08:00
 lixyz

传递:

	val intent = Intent(this, ImageCategoryActivity::class.java)
	intent.putExtra("Images", netDiskData!!.imageMap)
    	startActivity(intent)

接收:

val imageData =
            intent.getSerializableExtra("Images") as HashMap<String, ArrayList<ImageBean>>

ImageBean 是一个实体类,已经 Serializable 序列化

但是 AndroidStudio 会提示 Unchecked cast

Unchecked cast: Serializable! to kotlin.collections.HashMap<String, ArrayList<ImageBean> /* = ArrayList<ImageBean> */> /* = java.util.HashMap<String, ArrayList<ImageBean>> */

代码洁癖看着实在是烦人,搜了一圈,都是让 @SuppressWarnings("unchecked") 来解决编译器警告,但是并没有实际解决问题

你们有人遇到这种情况吗?是怎么解决的呢?谢谢谢谢

4728 次点击
所在节点    Android
7 条回复
ZSeptember
2020-12-25 18:00:48 +08:00
这不就是一个编译器警告吗?
你把一个 Object 强制转为 一个 Map,不得告警吗。
还想怎么解决。
mxalbert1996
2020-12-25 18:01:39 +08:00
这种编译器不确定但你可以确定没问题的情况正是 Suppress 的用途(你应该用 Kotlin 的 @Suppress ),Kotlin 的标准库也是这么做的。
https://github.com/JetBrains/kotlin/blob/532124d9a17e6939046bd0ff9ef5699d21d2ed2d/libraries/stdlib/src/kotlin/util/Lazy.kt#L84
lixyz
2020-12-25 18:08:04 +08:00
@mxalbert1996 明白了,多谢多谢,仔细想想,确实像你说的一样,要不然人家也不会平白无故搞个 Suppress 出来。。。是我钻牛角尖了
fromzero
2020-12-25 18:19:05 +08:00
是我的话我不会把 map 传到 intent 。最好把数据拍平,存到一个对象里。如果是拍不平非要用 map 就用 eventbus 之类的发送粘性事件来接收
lixyz
2020-12-25 18:26:18 +08:00
@fromzero 请教一下,为什么要这么做呢?这样做有什么好处啊?
fromzero
2020-12-25 18:43:57 +08:00
@lixyz intent 定位轻量数据,map 里如果只是几个数据那完全可以拍平。如果大量数据,比如你上面这种 map 里面还有 list list 里面可能又有嵌套的对象,可能几百个数据,你 debug 不出问题,不能保证所有手机没问题,每个手机 intent size
不一样。这序列化传起来就挺慢的,而且会出现你提出的这个类型问题。你得自己转类型。序列化之后编译器是无法知道类型的。强转这种复杂的结构就容易出错,所以最佳建议是只传输一个对象,并且里面尽量是基本数据类型字段。符合 intent 轻量数据定位
lixyz
2020-12-26 01:38:10 +08:00
@fromzero 有道理,多谢多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/738997

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX