- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个 foo
定义,其中一个应该更具体
def foo(f: java.util.function.ToIntFunction[String]) = println("foo1")
def foo[T](f: String=>T) = println("foo2")
//def foo[T](f: String=>T)(implicit d: DummyImplicit) = println("foo2") //Does not work either
foo({_: String => 1}) //Should pick foo1, but gives error instead
错误是:
error: ambiguous reference to overloaded definition,
both method foo in object Main of type [T](f: String => T)Unit
and method foo in object Main of type (f: java.util.function.ToIntFunction[String])Unit
我也尝试了DummyImplicit
的技巧,但它仍然给出相同的错误。当 Int
出现而不使用反射时,如何实现编译时过载?
我使用的是带有 SAM 类型支持的 Scala 2.12。
<小时/>编辑
我希望得到一个不限于使用Java转换器的解决方案,因为ToIntFunction接口(interface)可以被Scala特征取代,例如
trait ToIntFunction[T] { def apply(v: T): Int }
def foo(f: ToIntFunction[String]) = println("foo1")
def foo[T](f: String=>T) = println("foo2")
因为我认为这是方法重载的一个更普遍的问题。
最佳答案
在我的 Scala 2.12 机器上 foo({_: String => 1})
计算结果为 foo2
,因此我无法重现该问题。我对SAM conversion in overloading resolution的解读在 Scala 2.12 中,Function
类型的参数优先,因此它的计算结果应为 foo2
:
In order to improve source compatibility, overloading resolution has been adapted to prefer methods with Function-typed arguments over methods with parameters of SAM types.
注意_: String => 1
是Function1
。要强制其计算为 foo1
,请尝试 scala-java8-compat 中的 asJava
像这样:
import scala.compat.java8.FunctionConverters._
foo({_: String => 1}.asJava) // foo1
根据 Krzysztof Atłasik 的评论,它可以在 Scala 2.13 中重现。
关于scala - 含糊不清的过载,即使是更具体的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56622586/
我是一名优秀的程序员,十分优秀!