[3]Any的使用

前言

上节我们讲到了?:运算符的使用,大家有需要了解的可参看以下文章:
[1]Kotlin中的算数运算
[2]二元运算符 ?:
下面我们来讲一个特别的类:Any
今天我们涉及的内容有:
1.Any的概念
2.Any的源码
3.封装类DataUtil的介绍
4.DataUtilMainActivity中的使用
5.DataUtil源码

一. Any 的概念

AnyKotlin中所有类的超类,类似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 中的使用

下面给出DataUtilMainActivity中使用的示例代码:

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源码如下:

还有 15% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
支付 ¥3.00 继续阅读

推荐阅读更多精彩内容