我试图了解编译器在这种情况下的行为
object ImplicitTest extends App {
def foo[T](implicit x: (String => T)): T = ???
implicit val bar = (x: String) => x.toInt
foo
}
上面的代码无法编译并出现以下错误:
模糊隐含值:两个方法$符合对象的Predef 类型[A]⇒<:< [A,A]和对象ImplicitTest中的值栏⇒字符串⇒ Int匹配期望类型String⇒T
因为错误说我的隐式值与Predef中定义的另一个隐式进行冲突...基于此,似乎没有办法向将函数从已知类型转换为未知的函数声明隐式参数(通用)类型。
这是由于编译器的某些技术限制还是它应该工作的方式,而且我违反了一些我不知道的约束?
答案 0 :(得分:2)
当你调用它时,你没有向foo
提供类型参数(由于以下原因,没有其他方法可以推断它),因此编译器在找到正确的方法时遇到了麻烦,并且正确的隐含。
您在范围内有隐式bar: String => Int
,但还在Predef
中产生了=:=
和<:<
实例的含义扩展A => B
,并创建隐式String => A
。编译器正在为String => T
寻找一些隐式函数foo
,但它不确定哪一个,并且你有多个范围。 bar
不会优先,因为您没有指定它正在寻找的特定String => T
。
这将有效:
def foo[T](implicit x: (String => T)): T = ???
implicit val bar = (x: String) => x.toInt
foo[Int]