美文网首页禅与计算机程序设计艺术Android 开发技术分享Kotlin专题
kotlin倒霉的泛型-Map、List、数组通用长度测量工具

kotlin倒霉的泛型-Map、List、数组通用长度测量工具

作者: 半寿翁 | 来源:发表于2020-06-27 19:54 被阅读0次

    先扯两句

      作为一个android开发,从大学做毕设开始就就养成了一个不太好的习惯,见到apk就像解压缩拿图片资源,虽然已经有了一定的工作经验了,也知道了什么叫UI,什么叫美工,什么叫Photoshop,什么叫cutterman,但是。。。。好吧,就这样还没学会反编译。
      最近解压的时候,忽然发现APP的开发竟然都换了天地(虽然早有趋势,只是公司用不上,也没着急看),可当发现各大厂的包里都用了这个目录:
    今日头条

    今日头条*

    淘宝

    淘宝

    QQ音乐

    QQ音乐

      在想想到现在自己还用的java。。。
      谁想,打算用kotlin封装一个网络框架,需要测量一个泛型Map的长度,结果看起来虽然不麻烦,但是遇到泛型,真的是。。。啥也不说了,直接看正文吧。

    正文

      其实很多时候我们需要去计算Map、List、数组的长度,最简单的就是:

    class TestAdapter(val data: List<String>?) : BaseAdapter() {
    
        override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
            TODO("Not yet implemented")
        }
    
        override fun getItem(p0: Int): Any {
            TODO("Not yet implemented")
        }
    
        override fun getItemId(p0: Int): Long {
            TODO("Not yet implemented")
        }
    
        override fun getCount(): Int {
            return data.size
        }
    }
    

     &emsp这样写有问题吗?好像看起来还可以,但是如果你真这么写,就会看到如同的报错:

    报错信息

      ps:专业的大神们应该都知道,构造方法里传参,去掉data的类型List<String>? 后面的“ ? ”,让参数变成不可为空的,就不会出现对应的错误提示了。当然可以,只不过那样,就需要在调用构造方法前进行预判断是否为空了,至于是传参前预判断,还是在getCount()中处理哪种方案方便,就仁者见仁智者见智了,我这里只列举这样一种现象及对应的解决方案而已。如果可以达成共识,大家可以继续向后看了。

      由于前面的截图大家可以知道,这个方案肯定是行不通的,我们需要做一个判空处理,当然,也很简单,如下即可:

    List判空处理

      但是作为一个自以为资深的OOP(面向对象程序设计)开发人员,深知这种情况在日后会经常发生的,因此就想着封装成一个方法。

      于是做了如下尝试:

       第一种:模仿java的编程形式

    不添加泛型报错

      错误信息翻译:List<out E>接口期望得到一个类型参数。其实也就是说,kotlin的方法中,一旦涉及到泛型,必须指明其具体泛型类型。所以这个多亏kotlin可以直接使用Id,不然如果需要调用findViewById的话,虽然不用做强转,但是也会变成这个样子:

    TextView tv = findViewById<TextView>(R.id.tv)
    

      这跟强转有什么区别!!!!


    这跟强转有什么区别!!!!

       第二种:指定Any泛型

    竟然都没有报错

      为了方便测试,我们将代码略作简化:

    @Test
    fun addition_isCorrect() {
        val data: List<String>? = null
    
        Utils.sizeJudge(data)
    }
    

    相关文章

      网友评论

        本文标题:kotlin倒霉的泛型-Map、List、数组通用长度测量工具

        本文链接:https://www.haomeiwen.com/subject/tnarfktx.html