前言
上节我们讲到了?:
运算符的使用,大家有需要了解的可参看以下文章:
[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
源码如下: