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

淘宝

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()中处理哪种方案方便,就仁者见仁智者见智了,我这里只列举这样一种现象及对应的解决方案而已。如果可以达成共识,大家可以继续向后看了。
由于前面的截图大家可以知道,这个方案肯定是行不通的,我们需要做一个判空处理,当然,也很简单,如下即可:

但是作为一个自以为资深的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)
}