类型别名的 Scala 隐式转换
Scala implicit conversion for type aliases
定义
type TA[T] = T => Int
implicit class TAOps[T](a: TA[T]) {
def foo(): Unit = {println("TA")}
}
val ta: TA[Double] = x => x.toInt
现在,
ta.foo()
编译失败并显示消息 value foo is not a member of ammonite.$sess.cmd1.TA[Double]
、
同时显式调用
TAOps(ta).foo()
打印 TA
。为什么隐式转换在前一种情况下不起作用?
您的隐式 def 需要一个接收一个类型参数的类型,即 TA[T]
您的声明:val ta: TA[Double] = ...
本身就是一个类型,不接受任何类型参数。所以编译器不会使用你的隐式 def 来类型检查这个。
结论是您对采用类型参数的类型进行了隐式类型转换,而 TA[Double]
不采用任何类型参数。
解决方案:
1 - 替换隐式类型转换以接收 Function1
:
implicit class TAOps[T](a: T => Int) {
def foo: Unit = {
println("TA")
}
}
2 - 使用类型 lambdas:
implicit class TAOps[T](a: ({type Alias = TA[T]})#Alias) {
def foo: Unit = {
println("TA")
}
}
此处您创建的类型已柯里化。因此,编译器现在会将此隐式转换应用于匹配的类型,它不再期望接收 1 个类型参数的类型。
更多关于 Type Lambdas
定义
type TA[T] = T => Int
implicit class TAOps[T](a: TA[T]) {
def foo(): Unit = {println("TA")}
}
val ta: TA[Double] = x => x.toInt
现在,
ta.foo()
编译失败并显示消息 value foo is not a member of ammonite.$sess.cmd1.TA[Double]
、
同时显式调用
TAOps(ta).foo()
打印 TA
。为什么隐式转换在前一种情况下不起作用?
您的隐式 def 需要一个接收一个类型参数的类型,即 TA[T]
您的声明:val ta: TA[Double] = ...
本身就是一个类型,不接受任何类型参数。所以编译器不会使用你的隐式 def 来类型检查这个。
结论是您对采用类型参数的类型进行了隐式类型转换,而 TA[Double]
不采用任何类型参数。
解决方案:
1 - 替换隐式类型转换以接收 Function1
:
implicit class TAOps[T](a: T => Int) {
def foo: Unit = {
println("TA")
}
}
2 - 使用类型 lambdas:
implicit class TAOps[T](a: ({type Alias = TA[T]})#Alias) {
def foo: Unit = {
println("TA")
}
}
此处您创建的类型已柯里化。因此,编译器现在会将此隐式转换应用于匹配的类型,它不再期望接收 1 个类型参数的类型。
更多关于 Type Lambdas