object ScalaDemo extends App{
trait Calc[T] {
def multiply(x:T):T
}
/*
// 使用隐式值转换到隐式参数
class MultiplyWithInt extends Calc[Int] {
def multiply(x: Int): Int = x * x
}
class MultiplyWithString extends Calc[String] {
def multiply(x: String): String = x * 2
}
// 定义隐式值
implicit val i = new MultiplyWithInt()
implicit val s = new MultiplyWithString()
*/
// 使用隐式对象转换到隐式参数
// 定义隐式对象
implicit object ObjMultiplyWithInt extends Calc[Int]{
def multiply(x: Int): Int = x * x
}
implicit object ObjMultiplyWithString extends Calc[String]{
def multiply(x: String): String = x * 2
}
//函数柯里化,最后一个参数是隐式参数
def multiply[T:Calc](x:T)(implicit method:Calc[T]) = {
method.multiply(x)
}
println(multiply(2))
println(multiply("string"))
}