隐式参数和泛型类型

时间:2015-09-03 02:41:05

标签: scala implicit-parameters

我试图了解编译器在这种情况下的行为

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中定义的另一个隐式进行冲突...基于此,似乎没有办法向将函数从已知类型转换为未知的函数声明隐式参数(通用)类型。

这是由于编译器的某些技术限制还是它应该工作的方式,而且我违反了一些我不知道的约束?

1 个答案:

答案 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]