Mic*_*ier 7 scala type-conversion implicits
第一个示例成功找到了对方法的隐式转换foo(String),但是只要我添加一个类型参数(请参阅fails参考资料),编译就不再解析它了:
object works {
class A {
def foo(): String = ???
}
implicit class PimpedA(a: A) {
def foo(i: String): String = ???
}
val a = new A()
a.foo("test") //compiles
}
object fails { //same as `works`, but adds type parameter
class A {
def foo[T](): String = ???
}
implicit class PimpedA(a: A) {
def foo[T](i: String): String = ???
}
val a = new A()
PimpedA(a).foo("test") // compiles
a.foo("test") // error: too many arguments for method foo: ()String
}
Run Code Online (Sandbox Code Playgroud)
Scala 2.11.7和2.12.0-M3的行为相同.
关于implicits的文档似乎没有涵盖这一点,我没有在stackoverflow上找到这个确切的情况.
请注意,我的目标是重载该方法foo- 如果我重命名它,编译器会找到它.
http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html
这两种情况似乎都属于规范的这种情况:
视图在三种情况下应用:
...
在类型
e.m(args)为的选择中,如果选择器表示 的某些成员,但这些成员都不适用于参数。在这种情况下,将搜索适用于且其结果包含适用于 的方法的视图。搜索按照隐式参数的情况进行,其中隐式范围是 之一。如果找到这样的视图,则选择将转换为.eTmTargsvemargsTe.mv(e).m(args)
所以它应该有效。T我实际上很惊讶地看到它,因为我以前从未遇到过工作案例,并且假设如果有任何名为 的成员,则不会进行隐式搜索m。我快速浏览了http://issues.scala-lang.org/,但找不到相关问题。
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |