由于kotlin支持类型推导,所以很多时分变量的类型能够省掉,但有时分省掉变量类型又或许带来一些不便,甚至危险。本文记录下一些“主张声明类型”、“能够省掉类型”的场景。(暂时想到的不多,后续继续更新)
能够省掉类型的场景
- 变量声明后紧跟目标的创立
var file = File("/path/to/file")
直接经过构造方法创立目标时,创立进程本身就显式“声明”了类型。假如这时分还加类型声明,那就不是补全,而是多余了:
var file: File = File("/path/to/file")
- 变量声明后紧跟字面值
var num = 1
var str = "text"
这种状况是指等号右边是一个字面值,例如整数、字符串、布尔值,由于这种状况能够直接依据值来迅速判断出类型,且这个值的类型非常独立,不依赖外部上下文以及第三方库。
主张编写类型声明的场景
类型声明的作用除了提示这是什么样的数据(这一点IDEA的提示能够完成),还有束缚这个场景中必须是什么样的数据(这一点就需要手动弥补类型声明了,由于主动类型推导意味着“主动填充类型”,或许还有“主动修正类型”)。
- 部分的值函数
你当然能够这样写:
var fun1 = { i: Int ->
"num:$i"
}
但是由于IDE并不会一向辅佐显示这类函数的类型,终究阅览的时分仍是得依据函数完成来推导类型,或者将鼠标放上去一小会才能得到类型,那么不如直接补全类型:
var fun1: (Int) -> String =
{ i: Int -> // 这里的Int能够省去
"num:$i"
}
- 变量的值来自进程调用(尤其是这个进程来自别人的代码)
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}"
这里编写类型是为了防御预期以外的改变。
- 需要运用更为笼统的类型的时分
曾经写Java的时分,经常会这么写:
List<String> strList = new ArrayList<>();
有时分针对一个变量,并不一向是同一个详细类型,笼统的类型使得它能够指向更多的详细类型。假如运用类型推导,那么它默许或许是某一个详细类型:
var nums = arrayListOf(1,2,3)
那么后续我们无法将其他List目标赋值给它。这时分,我一般更倾向于编写:
var nums: List<Int> = arrayListOf(1, 2, 3)