前言
上节我们讲到了?:运算符的使用,大家有需要了解的可参看以下文章:
[1]Kotlin中的算数运算
[2]二元运算符 ?:
下面我们来讲一个特别的类:Any
今天我们涉及的内容有:
1.Any的概念
2.Any的源码
3.封装类DataUtil的介绍
4.DataUtil在MainActivity中的使用
5.DataUtil源码
一. Any 的概念
Any 是Kotlin中所有类的超类,类似Jvava中的Object。但Any表示的范围比Object更大。在Java中,Object是所有引用类的父类,但是不包括int,long等基本数据类型,因为基本数据类型对应的包装类是Integer等,而Object是这些包装类的父类。
在Kotlin中,Any 直接是所有类的父类。
二. Any 的源码
下面让我们来看看Any的源码:
public open class Any {
public open operator fun equals(other: Any?): Boolean
public open fun hashCode(): Int
public open fun toString(): String
}
可以看到一个对象会有三个方法: equals(other: Any?),hashCode()和toString()。这里的Any?表示一个可为null的对象,而Any则表示对象在声明和使用的过程中不能为null,否则会报异常。
三. 封装类 DataUtil 的介绍
基于Any,我们封装了一个DataUtil类,其有以下几个方法:
//对象是否为空
fun <T> isNull(obj: T?): Boolean
//对象是否不为null
fun <T> isNotNull(obj: T?): Boolean
/**判断类型**/
fun getDataByType(any: Any?): Any?
前两个方法为基本的对象判空,最后一个用于对一个未知类型的对象做类型判断。
四. DataUtil 在 MainActivity 中的使用
下面给出DataUtil在MainActivity中使用的示例代码:
package com.example.kdemo.ui.test
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.example.kdemo.R
import com.example.kdemo.databinding.ActivityTestBinding
import com.example.kdemo.exception.ExceptionChecker
import com.example.kdemo.util.data.collection.ListUtil
import com.example.kdemo.util.data.normal.DataUtil
import com.example.kdemo.util.log.LogUtil
import com.example.kdemo.util.data.normal.PairUtil
import com.example.kdemo.util.toast.ToastUtil
class TestActivity : AppCompatActivity(),View.OnClickListener {
private lateinit var mBinding: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityTestBinding.inflate(layoutInflater)
setContentView(mBinding.root)
initData()
setListener()
}
private fun initData() {}
private fun setListener() {
mBinding.mBtnTest.setOnClickListener(this)
}
override fun onClick(view: View) {
when (view.id) {
R.id.mBtnTest -> {
test()
}
else -> {
}
}
}
private fun test() {
ToastUtil.showShortToast(this, "begin test")
var temp = "a"
var temp1 = null
LogUtil.i("temp 是否为空: ${DataUtil.isNull(temp)}")
LogUtil.i("temp1 是否不为空: ${DataUtil.isNotNull(temp1)}")
var any1: Any? = DataUtil.getDataByType('c')
any1?.let {
LogUtil.i("$any1 是否为为 Char 类型: ${any1 is Char}")
}
var any2: Any? = DataUtil.getDataByType("a")
any2?.let {
LogUtil.i("$any2 是否为为 String 类型: ${any2 is String}")
}
var any3: Any? = DataUtil.getDataByType(3)
any3?.let {
LogUtil.i("$any3 是否为为 Int 类型: ${any3 is Int}")
}
var any4: Any? = DataUtil.getDataByType(4L)
any4?.let {
LogUtil.i("$any4 是否为为 Long 类型: ${any4 is Long}")
}
var any5: Any? = DataUtil.getDataByType(5F)
any5?.let {
LogUtil.i("$any5 是否为为 Float 类型: ${any5 is Float}")
}
var any6: Any? = DataUtil.getDataByType(5.0)
any6?.let {
LogUtil.i("$any6 是否为为 Double 类型: ${any6 is Double}")
}
var any7: Any? = DataUtil.getDataByType(2.toByte())
any7?.let {
LogUtil.i("$any7 是否为为 Byte 类型: ${any7 is Byte}")
}
var any8: Any? = DataUtil.getDataByType(8.toShort())
any8?.let {
LogUtil.i("$any8 是否为为 Short 类型: ${any7 is Short}")
}
var any9: Any? = DataUtil.getDataByType(null)
if(DataUtil.isNull(any9)){
LogUtil.i("$any9 为null")
}
}
}
运行结果如下:
temp 是否为空: false
temp1 是否不为空: false
c 是否为为 Char 类型: true
a 是否为为 String 类型: true
3 是否为为 Int 类型: true
4 是否为为 Long 类型: true
5.0 是否为为 Float 类型: true
5.0 是否为为 Double 类型: true
2 是否为为 Byte 类型: true
8 是否为为 Short 类型: false
null 为null
五. DataUtil 源码
DataUtil源码如下: