gpt4 book ai didi

scala - 含糊不清的过载,即使是更具体的

转载 作者:行者123 更新时间:2023-12-03 04:40:52 24 4
gpt4 key购买 nike

我有两个 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 => 1Function1。要强制其计算为 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/

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