gpt4 book ai didi

scala - 为什么带有类型参数的重载方法的 Scala 隐式解析失败?

转载 作者:行者123 更新时间:2023-12-04 12:53:13 25 4
gpt4 key购买 nike

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

关于隐式的文档似乎没有涵盖这一点,我没有在 stackoverflow 上找到这种确切的情况。

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

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

最佳答案

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

Views are applied in three situations:

...

In a selection e.m(args) with e of type T, if the selector m denotes some member(s) of T, but none of these members is applicable to the arguments args. In this case a view v is searched which is applicable to e and whose result contains a method m which is applicable to args. The search proceeds as in the case of implicit parameters, where the implicit scope is the one of T. If such a view is found, the selection e.m is converted to v(e).m(args).


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

关于scala - 为什么带有类型参数的重载方法的 Scala 隐式解析失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33162618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com