Kotlin特性:空类型和智能类型转换

今天药忘吃喽~ 2022-05-28 04:58 200阅读 0赞

一、首先看一下Java中关于空指针的问题处理

  1. /** * @author:wangdong * @description: 先看一下java的空类型问题 */
  2. public class NullUnSafe {
  3. public static void main(String[] args){
  4. //为避免出现空指针导致程序崩溃
  5. String name = getName();
  6. if (null == name){
  7. System.out.println("name is null");
  8. }else {
  9. System.out.println(getName().length());
  10. }
  11. }
  12. public static String getName(){
  13. return null;
  14. }
  15. }

二、如果在Kotlin中这样写的话,根本就不会编译通过

  1. /** * @author:wangdong * @description: */
  2. fun getName(): String{
  3. return null
  4. }
  5. fun main(args: Array<String>) {
  6. println(getName().length)
  7. }

这里写图片描述

如果你想在判断方法是否等于null,编译器会说判断没有用,永远为false

  1. if (getName() == null)
  2. /**如果你偏要返回一个null*/
  3. fun getName(): String ?{
  4. return null
  5. }
  6. fun main(args: Array<String>) {
  7. //就需要这么做了
  8. //val name: String = getName() ?: return
  9. //println(name.length)
  10. val value: String ?= "helloworld"
  11. //告诉编译器不用担心为null
  12. println(value!!.length)
  13. }

二、类型转换
例如:定义了两个类,一个Parent父类,一个Child子类,子类继承了父类,并且子类新增了一个自己的方法

  1. package net.println.kotlin
  2. /** * @author:wangdong * @description: */
  3. fun main(args: Array<String>) {
  4. //明确知道parent是Child的类型
  5. val parent: Parent = Child()
  6. if (parent is Child){
  7. println(parent.name)
  8. }
  9. //即时直接说明了a为hello
  10. val a: String ?= "hello"
  11. //直接这样,编译器还是会说是不安全的,编译不通过
  12. //println(a.length)
  13. //那么就先判断下
  14. if (a != null)
  15. println(a.length)
  16. //如果直接按照下面的做法
  17. val p: Parent = Parent();
  18. //用一个Child类型的child去接收,?=是允许p为空的意思,p as Child是p强制转成Child类型
  19. //val child:Child ?= p as Child
  20. //会抛Exception in thread "main" java.lang.ClassCastException: net.println.kotlin.Parent cannot be cast to net.println.kotlin.Child
  21. // at net.println.kotlin.KotlinTypeCastKt.main(KotlinTypeCast.kt:26)
  22. //如果不想让它抛异常,as后面加个?号,意思是如果转换失败了,不要跑异常,返回一个null赋值给child
  23. val child:Child ?= p as? Child
  24. println(child) //child 输出null
  25. }

三、空类型的说明
任意类型都有可空和不可空两种

  1. //val notNull: String = null //错误,不能为空
  2. val notNull: String = "baidu" //正确
  3. val nullable: String? = null //正确,可以为空
  4. notNull.length //正确,不为空的值可以直接使用
  5. //nullable.length //错误,可能为空,不能直接获取长度
  6. nullable!!.length //正确,强制认定nullable不为空
  7. nullable?.length //正确,如果nullable不为空,返回空

四、智能类型转换
Java的风格,转换失败会抛异常

  1. val sub: SubClass = parent as SubClass

Kotlin的安全类型转换,加个❓

  1. val child:Child ?= parent as? Child

kotlin特性:如果前面编译器明确知道了类型,在后面就不用再进行无用的类型转换了,直接使用即可

  1. //明确知道parent是Child的类型
  2. val parent: Parent = Child()
  3. if (parent is Child){
  4. 直接使用child的方法
  5. println(parent.name)
  6. }

可以通过if判断

  1. //即时直接说明了a为hello
  2. val a: String ?= "hello"
  3. //直接这样,编译器还是会说是不安全的,编译不通过
  4. //println(a.length)
  5. //那么就先判断下
  6. if (a != null)
  7. println(a.length)

发表评论

表情:
评论列表 (有 0 条评论,200人围观)

还没有评论,来说两句吧...

相关阅读