Kotlin 中, Intent 传递 Map 遇到 Unchecked cast 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lixyz

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

  •  
  •   lixyz Dec 25, 2020 12752 views
    This topic created in 1953 days ago, the information mentioned may be changed or developed.

    传递:

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

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

    Supplement 1    Dec 25, 2020
    使用这种方法解决了:

    ```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
    }
    ```
    Supplement 2    Dec 25, 2020
    反正是把烦人的提示给消除了,真的是看到那个提示就烦人,IDE 不提示绿色对勾就不得劲儿
    looplj
        1
    looplj  
       Dec 25, 2020
    这不就是一个编译器警告吗?
    你把一个 Object 强制转为 一个 Map,不得告警吗。
    还想怎么解决。
    mxalbert1996
        span class="no">2
    mxalbert1996  
       Dec 25, 2020 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
       Dec 25, 2020
    @mxalbert1996 明白了,多谢多谢,仔细想想,确实像你说的一样,要不然人家也不会平白无故搞个 Suppress 出来。。。是我钻牛角尖了
    fromzero
        4
    fromzero  
       Dec 25, 2020 via Android
    是我的话我不会把 map 传到 intent 。最好把数据拍平,存到一个对象里。如果是拍不平非要用 map 就用 eventbus 之类的发送粘性事件来接收
    lixyz
        5
    lixyz  
    OP
       Dec 25, 2020
    @fromzero 请教一下,为什么要这么做呢?这样做有什么好处啊?
    fromzero
        6
    fromzero  
       Dec 25, 2020 via Android
    @lixyz intent 定位轻量数据,map 里如果只是几个数据那完全可以拍平。如果大量数据,比如你上面这种 map 里面还有 list list 里面可能又有嵌套的对象,可能几百个数据,你 debug 不出问题,不能保证所有手机没问题,每个手机 intent size
    不一样。这序列化传起来就挺慢的,而且会出现你提出的这个类型问题。你得自己转类型。序列化之后编译器是无法知道类型的。强转这种复杂的结构就容易出错,所以最佳建议是只传输一个对象,并且里面尽量是基本数据类型字段。符合 intent 轻量数据定位
    lixyz
        7
    lixyz  
    OP
       Dec 26, 2020
    @fromzero 有道理,多谢多谢
    About     Help     Advertise     Blog     API     FAQ     Solana     2596 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 12:48 PVG 20:48 LAX 05:48 JFK 08:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86