如何用scala implicits解决方法委托

时间:2015-09-21 10:59:33

标签: scala implicit implicits

我如何解决这个简单的问题。类转换的类型方法来自,它采用两个类型参数A和B,并从 A 返回 B 。我已经在伴侣对象中定义了一些暗示,以提供默认的beahviour。

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

我收到了以下错误

  • 方法的参数不足:(隐式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) )

1 个答案:

答案 0 :(得分:3)

问题是Scala编译器无法在f: (A) => B范围内找到参数myFun的隐式值。你需要做的是告诉编译器只有在有这样的值时才能调用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))
  }
}