隐式参数和通用类型

丹尼尔·卡玛达(Daniel Camarda)

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

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

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

迈克尔·扎亚克(Michael Zajac)

您没有foo在调用时提供类型参数(并且由于以下原因,没有其他方法可以推断出它),因此编译器在查找正确的参数和隐式的权利时遇到了麻烦。

bar: String => Int在范围内具有隐式,但在其中具有隐式,Predef可创建的实例=:=<:<都扩展的实例A => B,并创建隐式String => A编译器正在寻找一些隐函数String => Tfoo,但它不知道哪一个,你必须在范围多。bar不会优先,因为您尚未指定要String => T查找的特定对象。

这将起作用:

def foo[T](implicit x: (String => T)): T = ???

implicit val bar = (x: String) => x.toInt

foo[Int]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从返回类型推断通用隐式参数的类型

来自分类Dev

隐式参数和类型族

来自分类Dev

Scala-抽象类型和隐式参数解析

来自分类Dev

类型参数的统一和隐式转换

来自分类Dev

Scala:通用方法隐式参数

来自分类Dev

非通用隐式参数的Scala糖

来自分类Dev

隐式转换以使通用类型可用

来自分类Dev

隐式转换以使通用类型可用

来自分类Dev

隐式参数和ClassTag

来自分类Dev

隐式类型和通配符

来自分类Dev

类型''不能在通用类型或方法''中用作类型参数'T'。没有从“到”的隐式引用转换

来自分类Dev

该类型不能用作通用类型或方法'BaseController <T>'中的类型参数'T'。没有隐式引用

来自分类Dev

groovy隐式函数参数类型转换

来自分类Dev

在泛型类隐式类型参数

来自分类Dev

Scala嵌套隐式类型参数

来自分类Dev

C#通用隐式运算符返回类型

来自分类Dev

无法在通用方法中隐式转换类型错误

来自分类Dev

C#-隐式转换或推断通用返回类型

来自分类Dev

具有隐式属性类型的通用打字稿

来自分类Dev

TypeScript:从对象内容隐式推断通用接口的对象类型

来自分类Dev

为什么对对象类型转换通用的是隐式的?

来自分类Dev

隐式转换,类型参数,重载和匿名函数语法

来自分类Dev

用子类型扩展scalaz中的Enum和隐式参数

来自分类Dev

当我混合使用隐式,类型参数和Nothing时发生编译错误

来自分类Dev

使用Rails 4.0.2和Strong参数不会将Array类型隐式转换为Integer

来自分类Dev

函数特征和隐式参数

来自分类Dev

Scala隐式转换和参数

来自分类Dev

类型推断和隐式链接

来自分类Dev

Lambda类型推断和隐式转换