如何用scala implicits解决方法委托

How to solve method delegation with scala implicits

我该如何解决这个简单的问题。 Class 转换有一个类型化方法 from,它接受两个类型参数 A 和 B 和 returns 一个 B 来自 A。我在伴随对象中定义了一些隐式以提供默认行为。

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

我收到以下错误

我想知道为什么这会造成任何问题。有人可以向我解释为什么以及如何解决这个问题吗?

这是代码

  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

下面的代码应该可以解决问题

object App {
  trait Convertible[A, B] {
    def convert(a: A): B
  }

  object Convertible {
    implicit val int2String = new Convertible[Int, String] {
      override def convert(a: Int): String = a.toString
    }

    implicit val float2String = new Convertible[Float, String] {
      override def convert(a: Float): String = a.toString
    }
  }

  def myFun[A ,B](a:A)(implicit converter: Convertible[A, B]): B = {
    converter.convert(a)
  }

  def main(args: Array[String]): Unit = {
    println(myFun(3))
  }
}