如何用scala隐式解决方法委托

如何用scala隐式解决方法委托,scala,implicit,implicits,Scala,Implicit,Implicits,我怎样才能解决这个简单的问题。类转换有一个类型化方法from,它接受两个类型参数a和B,并从a返回一个B。我在同伴对象中定义了一些隐式,以提供默认beahviour 我的问题是,当我试图将调用转发到另一个类型化方法中的转换类时,该方法具有相同的签名,但它不起作用。在我的示例中,我尝试将调用从functionmyFun转发到我的转换类 我犯了以下错误 方法的参数不足:(隐式f:A=>B) 我想知道为什么会有问题。有人能告诉我为什么以及如何克服这个问题吗 这是密码 object MyConv

我怎样才能解决这个简单的问题。类转换有一个类型化方法from,它接受两个类型参数a和B,并从a返回一个B。我在同伴对象中定义了一些隐式,以提供默认beahviour

我的问题是,当我试图将调用转发到另一个类型化方法中的转换类时,该方法具有相同的签名,但它不起作用。在我的示例中,我尝试将调用从functionmyFun转发到我的转换类

我犯了以下错误

  • 方法的参数不足:(隐式f:A=>B)
我想知道为什么会有问题。有人能告诉我为什么以及如何克服这个问题吗

这是密码

  object MyConversions {

     implicit val IntToStr = (f:Int) => f.toString()

     implicit val DoubleToStr = (f:Double) => f.toString()

     implicit val BooleanToStr = (f:Boolean) => f.toString()

  }

  class Conversions{
     def from[A,B](a:A)(implicit f:(A) => B) = {
       f(a)
     }
  }

  import MyConversions._;

  def myFun[A,B](a:A){
    // Error
    new Conversions().from[A, B](a)
  }

  // Working
  println( new Conversions().from[Int, String](3) )

问题是Scala编译器在
myFun
范围内找不到参数
f:(A)=>B
的隐式值。你要做的是告诉编译器只有当有这样一个值可用时才能调用
myFun

下面的代码应该可以做到这一点

对象应用程序{
可转换特征[A,B]{
def转换(a:a):B
}
可转换对象{
隐式val int2String=新的可转换[Int,String]{
覆盖def convert(a:Int):字符串=a.toString
}
隐式val float2String=新的可转换[Float,String]{
覆盖def convert(a:Float):字符串=a.toString
}
}
def myFun[A,B](A:A)(隐式转换器:可转换[A,B]):B={
convert.convert(a)
}
def main(参数:数组[字符串]):单位={
println(myFun(3))
}
}

上下文中没有隐式定义的泛型f:(A)=>B。我知道,但如何才能以正确的方式实现这一点。我认为这是一个常见的问题。我认为隐式将在源类型中查找,在这种情况下,源类型将是转换。不,在您的情况下,隐式将只在当前范围和
a
B
的伴随对象中查找。有一个问题我仍然不清楚。如何使对象可转换可扩展到其他用户,这些用户可以提供自己的隐式,而无需将具体的可转换对象传递给myFun。假设我们需要另一种将布尔值转换为字符串的方法?对于标准类型,如从
布尔值
字符串
,您必须将其添加到
可转换的
伴随对象中。如果用户定义了一个新类型,比如说
Foo
,并且想要定义从
Foo
String
的转换,那么他可以在
Foo
的伴生对象中定义隐式
可转换的[Foo,String]
,然后就会找到它。我可以问你另一个问题吗?