由于kotlin支持类型推导,所以很多时分变量的类型能够省掉,但有时分省掉变量类型又或许带来一些不便,甚至危险。本文记录下一些“主张声明类型”、“能够省掉类型”的场景。(暂时想到的不多,后续继续更新)

能够省掉类型的场景

  1. 变量声明后紧跟目标的创立
var file = File("/path/to/file")

直接经过构造方法创立目标时,创立进程本身就显式“声明”了类型。假如这时分还加类型声明,那就不是补全,而是多余了:

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

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

主张编写类型声明的场景

类型声明的作用除了提示这是什么样的数据(这一点IDEA的提示能够完成),还有束缚这个场景中必须是什么样的数据(这一点就需要手动弥补类型声明了,由于主动类型推导意味着“主动填充类型”,或许还有“主动修正类型”)。

  1. 部分的值函数

你当然能够这样写:

var fun1 = { i: Int ->
    "num:$i"
}

但是由于IDE并不会一向辅佐显示这类函数的类型,终究阅览的时分仍是得依据函数完成来推导类型,或者将鼠标放上去一小会才能得到类型,那么不如直接补全类型:

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

这个时分IDEA或许(有些时分不会)会在a处的变量i后边弥补:Int提示,不过我仍是主张明确声明类型,理由是:

  • 这个test函数或许来自别人写的某个模块,他或许修正返回值类型,假如利用主动类型推导,那么在后续运用不出错的状况下,这个修正对调用方或许是无感的,但程序或许已经出了问题,例如:
fun test(): Int {
    return 1
}
//fun test(): String { //改成这个完成,后边程序照样运行,但语义完全不同了
//    return "asdf"
//}
val i = test()
val x = "add:${i + 10}"

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

  1. 需要运用更为笼统的类型的时分

曾经写Java的时分,经常会这么写:

List<String> strList = new ArrayList<>();

有时分针对一个变量,并不一向是同一个详细类型,笼统的类型使得它能够指向更多的详细类型。假如运用类型推导,那么它默许或许是某一个详细类型:

var nums = arrayListOf(1,2,3)

那么后续我们无法将其他List目标赋值给它。这时分,我一般更倾向于编写:

var nums: List<Int> = arrayListOf(1, 2, 3)