V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lixyz
V2EX  ›  Android

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

  •  
  •   lixyz · 2020-12-25 17:55:04 +08:00 · 4542 次点击
    这是一个创建于 1216 天前的主题,其中的信息可能已经有所发展或是发生改变。

    传递:

    	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") 来解决编译器警告,但是并没有实际解决问题

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

    第 1 条附言  ·  2020-12-25 18:30:40 +08:00
    使用这种方法解决了:

    ```kotlin
    fun castHashMap(any: Any): HashMap<String, ArrayList<ImageBean>> {
    val map: HashMap<String, ArrayList<ImageBean>> = HashMap()
    if (any is HashMap<*, *>) {
    for (key in any.keys){
    val imageList = ArrayList<ImageBean>()
    if(any[key] is ArrayList<*>){
    val list = any[key] as ArrayList<*>
    for (bean in list){
    val imageBean = bean as ImageBean
    imageList.add(imageBean)
    }
    }
    map[key.toString()] = imageList
    }
    }
    return map
    }
    ```
    第 2 条附言  ·  2020-12-25 18:31:29 +08:00
    反正是把烦人的提示给消除了,真的是看到那个提示就烦人,IDE 不提示绿色对勾就不得劲儿
    ZSeptember
        1
    ZSeptember  
       2020-12-25 18:00:48 +08:00
    这不就是一个编译器警告吗?
    你把一个 Object 强制转为 一个 Map,不得告警吗。
    还想怎么解决。
    mxalbert1996
        2
    mxalbert1996  
       2020-12-25 18:01:39 +08:00 via Android
    这种编译器不确定但你可以确定没问题的情况正是 Suppress 的用途(你应该用 Kotlin 的 @Suppress ),Kotlin 的标准库也是这么做的。
    https://github.com/JetBrains/kotlin/blob/532124d9a17e6939046bd0ff9ef5699d21d2ed2d/libraries/stdlib/src/kotlin/util/Lazy.kt#L84
    lixyz
        3
    lixyz  
    OP
       2020-12-25 18:08:04 +08:00
    @mxalbert1996 明白了,多谢多谢,仔细想想,确实像你说的一样,要不然人家也不会平白无故搞个 Suppress 出来。。。是我钻牛角尖了
    fromzero
        4
    fromzero  
       2020-12-25 18:19:05 +08:00 via Android
    是我的话我不会把 map 传到 intent 。最好把数据拍平,存到一个对象里。如果是拍不平非要用 map 就用 eventbus 之类的发送粘性事件来接收
    lixyz
        5
    lixyz  
    OP
       2020-12-25 18:26:18 +08:00
    @fromzero 请教一下,为什么要这么做呢?这样做有什么好处啊?
    fromzero
        6
    fromzero  
       2020-12-25 18:43:57 +08:00 via Android
    @lixyz intent 定位轻量数据,map 里如果只是几个数据那完全可以拍平。如果大量数据,比如你上面这种 map 里面还有 list list 里面可能又有嵌套的对象,可能几百个数据,你 debug 不出问题,不能保证所有手机没问题,每个手机 intent size
    不一样。这序列化传起来就挺慢的,而且会出现你提出的这个类型问题。你得自己转类型。序列化之后编译器是无法知道类型的。强转这种复杂的结构就容易出错,所以最佳建议是只传输一个对象,并且里面尽量是基本数据类型字段。符合 intent 轻量数据定位
    lixyz
        7
    lixyz  
    OP
       2020-12-26 01:38:10 +08:00
    @fromzero 有道理,多谢多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1008 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:05 · PVG 05:05 · LAX 14:05 · JFK 17:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.