我试图了解这种情况下编译器的行为
object ImplicitTest extends App {
def foo[T](implicit x: (String => T)): T = ???
implicit val bar = (x: String) => x.toInt
foo
}
上面的代码无法编译,并出现以下错误:
不明确的隐式值:方法$ conforms在类型[A]⇒<:<[A,A]的对象Predef中,并且在对象的ImplicitTest类型⇒字符串⇒Int匹配预期的类型String⇒T中都符合
由于错误表明我的隐式值与Predef中定义的另一个隐式值冲突...基于此,似乎无法将隐式参数声明为将值从已知类型转换为未知(泛型)类型的函数。
这是由于对编译器的某些技术限制还是仅仅是它应该工作的方式,而我违反了一些我不知道的约束?
您没有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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句