隐式转换
作用是:在类型转换的过程中,被自动调用
特点
- 自动调用
- 名字不重要,形参和返回值的类型是重要的!
- 不能把Double类型保存到 Int。这样会有精度损失,不会自动做转换。
- 可以把int类型保存到Double,会自动转
package imp
object imp01 {
// 隐式转换
// 作用是:在类型转换的过程中,被自动调用
// 特点
// 1. 自动调用
// 2. 名字不重要,形参和返回值的类型是重要的!
implicit def double2Int(d: Double): Int = {
println("double2Int被调用了......")
d.toInt
}
// 新增:String转Int的隐式转换(解决i = "100"的类型不匹配)
implicit def string2Int(s: String): Int = {
println("string2Int被调用了......")
s.toInt
}
def main(args: Array[String]): Unit = {
// 不能把Double类型 保存到 Int。这样会有精度损失,不会自动做转换。
var i: Int = 1.1
i = 2.1
i = 3.1
i = "100" // 现在可通过隐式转换支持String转Int
// 可以把int类型保存到Double,会自动转换
var d: Double = 1
}
}
package imp
object imp02 {
class KM(var value:Double) {
override def toString: String = s"${value}千米"
}
class M(var value:Double) {
override def toString: String = s"${value}米"
}
implicit def km2m(km:KM): M = {
new M(1000 * km.value)
}
def main(args: Array[String]): Unit = {
val km1 = new KM(1)
val m1:M = km1
println(km1)
println(m1)
}
}
补充隐式函数:实现WY(美元)到RMB(人民币)的转换
package imp
object imp03 {
// 1美元 = 6.9人民币
// 1人民币 = 0.14美元
class WY(var value:Double) {
override def toString: String = s"${value}美元"
}
class RMB(var value:Double) {
override def toString: String = s"${value}人民币"
}
// 补充隐式函数:实现WY(美元)到RMB(人民币)的转换
implicit def wy2rmb(wy: WY): RMB = {
new RMB(wy.value * 6.9)
}
def main(args: Array[String]): Unit = {
val m1:RMB = new WY(100)
println(m1)
}
}