Kotlin入门学习笔记基础篇(二)
可缺省参数默认值、可空参数与java重载注解
java中的重载,在kotlin中通过为可缺省参数提供默认值来实现,添加@JvmOverloads注解是为了转换成java代码时,自动生成重载函数,kotlin中为可缺省参数提供默认值写法如下
@JvmOverloads //包含可缺省默认参数和可空参数,增加java重载注解
fun addProduct(name: String, price: Double = 0.0, desc: String? = null) =
"Adding product with $name, ${desc ?: "None"}, and " + NumberFormat.getCurrencyInstance()
.format(price)
上面addProduct方法只有一行,可以简化用 = 号,省略{ }函数体括号,类似于python中的lambda方法
等同于下方常规写法:
@JvmOverloads //包含可缺省默认参数和可空参数,增加java重载注解
fun addProduct(name: String, price: Double = 0.0, desc: String? = null){
"Adding product with $name, ${desc ?: "None"}, and " + NumberFormat.getCurrencyInstance()
.format(price)
}
可通过以下代码测试
@Test
fun `check all overloads`() {
println(addProduct("Name_", 5.0, "Desc"))
println(addProduct("Name_", 5.0))
println(addProduct("Name_"))
}
类的构造函数重载类似,在类名后加@JvmOverloads注解,并声明constructor
//类的构造函数重载方法中包含可省略的默认参数时,@JvmOverloads重载,后面显示声明 constructor
data class Porduct @JvmOverloads constructor(
val name: String,
val price: Double = 0.0,
val desc: String? = null
)
显式类型转换
与java的int、long等原生数据类型不同,kotlin中的Int和Long等都是类,所以不会自动转换,需要显式转换
- 使用toInt() toLong()等显式转换函数
- +号操作符重载隐式转换为+前面的类型
fun test3() {
var intVar: Int = 3
val longVar: Long = intVar.toLong()
val byteVar: Byte = intVar.toByte()
val charVar: Char = intVar.toChar()
val shortVar: Short = intVar.toShort()
val floatVar: Float = intVar.toFloat()
val doubleVar: Double = intVar.toDouble()
val intVar2: Int = doubleVar.toInt()
val longVar2 = intVar.toLong()
//+号操作符重载隐式转换至前面的类型
val longVar3 = 0L + intVar
val stringVar = "" + intVar
var longVar4 = intVar.toLong()
}
打印不同的进制
java中用Integer.toString(int, int)第一个int是带转换的值,第二个int是进制
kotlin中使用Java的方法,并使其成为Byte、Short、Int以及Long的扩展函数:toString(radix: Int)
var a = 42
println(a.toString(8)) //打印a的八进制:52
println(36.toString(5)) //打印36的五进制:121