【问题标题】:Why does Scala implicit resolution fail for overloaded method with type parameter?为什么带有类型参数的重载方法的Scala隐式解析失败?
【发布时间】:2015-10-16 04:33:05
【问题描述】:

第一个示例成功地找到了到方法 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
}

Scala 2.11.7 和 2.12.0-M3 的这种行为是相同的。

有关implicits 的文档似乎没有涵盖这一点,而且我在stackoverflow 上也没有找到这种确切的情况。

请注意,我的目标是重载方法foo - 如果我重命名它,编译器会找到它。

http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html

【问题讨论】:

  • 你为什么要用同一个名字foo来给那个拉皮条的?也许这很明显,但是如果您将其称为 bar,则不会出现错误
  • 我知道,但我想重载foo - 我刚刚更新了问题。

标签: scala type-conversion implicits


【解决方案1】:

这两种情况似乎都属于the specification这种情况:

视图应用于三种情况:

...

e 类型为T 的选择e.m(args) 中,如果选择器m 表示T 的某些成员,但这些成员都不适用于参数args。在这种情况下,搜索适用于e 的视图v,其结果包含适用于args 的方法m。搜索与隐式参数的情况一样进行,其中隐式范围是T 之一。如果找到这样的视图,则选择 e.m 将转换为 v(e).m(args)

所以它应该工作。看到它我真的很惊讶,因为我以前从未遇到过工作案例,并假设如果T 有任何名为m 的成员,则没有隐式搜索。我快速浏览了http://issues.scala-lang.org/,但找不到相关问题。

【讨论】:

猜你喜欢
  • 2021-06-03
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
相关资源
最近更新 更多