Kotlin 类型声明相关的一些注意事项

由于kotlin支持类型推导,所以很多时候变量的类型可以省略,但有时候省略变量类型又可能带来一些不便,甚至隐患。本文记录下一些"建议声明类型"、"可以省略类型"的场景。(暂时想到的不多,后续持续更新)

可以省略类型的场景

  1. 变量声明后紧跟对象的创建
kotlin 复制代码
var file = File("/path/to/file")

直接通过构造方法创建对象时,创建过程本身就显式"声明"了类型。如果这时候还加类型声明,那就不是补全,而是多余了:

kotlin 复制代码
var file: File = File("/path/to/file")
  1. 变量声明后紧跟字面值
kotlin 复制代码
var num = 1
var str = "text"

这种情况是指等号右边是一个字面值,例如整数、字符串、布尔值,因为这种情况可以直接根据值来迅速判断出类型,且这个值的类型非常独立,不依赖外部上下文以及第三方库。

建议编写类型声明的场景

类型声明的作用除了提示这是什么样的数据(这一点IDEA的提示可以完成),还有约束这个场景中必须是什么样的数据(这一点就需要手动补充类型声明了,因为自动类型推导意味着"自动填充类型",可能还有"自动修改类型")。

  1. 局部的值函数

你当然可以这样写:

kotlin 复制代码
var fun1 = { i: Int ->
    "num:$i"
}

但是因为IDE并不会一直辅助显示这类函数的类型,最终阅读的时候还是得根据函数实现来推导类型,或者将鼠标放上去一小会才能得到类型,那么不如直接补全类型:

kotlin 复制代码
var fun1: (Int) -> String =
      { i: Int -> // 这里的Int可以省去
          "num:$i"
      }
  1. 变量的值来自过程调用(尤其是这个过程来自别人的代码)
kotlin 复制代码
fun test(): Int {
    return 1
}

var i = test() // a

这个时候IDEA可能(有些时候不会)会在a处的变量i后面补充:Int提示,不过我还是建议明确声明类型,理由是:

  • 这个test函数可能来自别人写的某个模块,他可能修改返回值类型,如果利用自动类型推导,那么在后续使用不出错的情况下,这个修改对调用方可能是无感的,但程序可能已经出了问题,例如:
kotlin 复制代码
fun test(): Int {
    return 1
}

//fun test(): String { //改成这个实现,后面程序照样运行,但语义完全不同了
//    return "asdf"
//}

val i = test()
val x = "add:${i + 10}"

这里编写类型是为了防御预期以外的变更。

  1. 需要使用更为抽象的类型的时候

以前写Java的时候,经常会这么写:

java 复制代码
List<String> strList = new ArrayList<>();

有时候针对一个变量,并不一直是同一个具体类型,抽象的类型使得它可以指向更多的具体类型。如果使用类型推导,那么它默认可能是某一个具体类型:

kotlin 复制代码
var nums = arrayListOf(1,2,3)

那么后续我们没法将其他List对象赋值给它。这时候,我通常更倾向于编写:

kotlin 复制代码
var nums: List<Int> = arrayListOf(1, 2, 3)
相关推荐
岸芷漫步3 小时前
Kotlin中协程的关键函数分析
kotlin
纳于大麓9 小时前
Kotlin基础语法五
android·开发语言·kotlin
移动开发者1号10 小时前
嵌套滚动交互处理总结
android·kotlin
移动开发者1号10 小时前
Android工程中FTP加密传输与非加密传输的深度解析
android·java·kotlin
yzpyzp1 天前
Kotlin的MutableList和ArrayList区别
android·kotlin
帅次1 天前
Flutter Container 组件详解
android·flutter·ios·小程序·kotlin·iphone·xcode
帅次1 天前
Flutter setState() 状态管理详细使用指南
android·flutter·ios·小程序·kotlin·android studio·iphone
移动开发者1号1 天前
Compose列表项动画实现指南
android·kotlin
移动开发者1号1 天前
Compose与View系统互操作方案
android·kotlin
heeheeai2 天前
kotlin kmp 副作用函数 effect
kotlin·effect·kmp·副作用函数