如何修复这个类型类示例?

时间:2015-04-01 10:14:26

标签: scala typeclass

这是我之前的question

的后续内容

假设我创建了以下测试converter.scala

trait ConverterTo[T] {
  def convert(s: String): Option[T]
}

object Converters {
  implicit val toInt: ConverterTo[Int] =
    new ConverterTo[Int] { 
      def convert(s: String) = scala.util.Try(s.toInt).toOption
    }
}

class A {
  import Converters._
  def foo[T](s: String)(implicit ct: ConverterTo[T]) = ct.convert(s)
}

现在当我试图在REPL中调用foo时,它无法编译:

scala> :load converter.scala
Loading converter.scala...
defined trait ConverterTo
defined module Converters
defined class A

scala> val a = new A()

scala> a.foo[Int]("0")
<console>:12: error: could not find implicit value for parameter ct: ConverterTo[Int]
          a.foo[Int]("0")
                    ^

1 个答案:

答案 0 :(得分:2)

import Converters._中的

class A并没有削减它。您可以删除它,代码仍然可以编译。编译器需要在实际隐式中找到的那一刻不在class A中,其中foo刚刚被声明。

编译器需要在调用REPL中的ConverterTo[Int]时在隐式作用域中找到a.foo[Int](..)。所以这就是进口需要的地方。

如果object Converterstrait ConverterTo的名称相同(因此会有一个伴随对象),则不需要导入。