定义多个隐式val时无法解析符号X

时间:2019-05-31 07:10:45

标签: string scala implicit-conversion implicit

我正在测试下面显示的一些代码,这些代码基本上定义了多个隐式val,它们将一个字符串作为输入并将其转换为相应的类型。

我遇到的问题是,由于某些原因,诸如toLongtoDoubletoInt之类的转换无法解决。

class Parse[T](val f: String => T) extends (String => T) {
  def apply(s: String): T = f(s)
}

object Parse {
  def apply[T](f: String => T) = new Parse[T](f)

  implicit val parseLong: Parse[Long] = Parse[Long](s => s.toLong)
  implicit val parseDouble: Parse[Double] = Parse[Double](s => s.toDouble)
  implicit val parseInt: Parse[Int] = Parse[Int](s => s.toInt)
}

此代码有什么问题?

1 个答案:

答案 0 :(得分:4)

问题在于,由于Parse扩展了String => T,隐式parseLongparseDoubleparseInt不仅定义了Parse的实例,还定义了以及隐式转换String => LongString => DoubleString => Int。由于.toLong.toDouble.toInt是扩展方法,因此会产生歧义。

您可以删除extends (String => T)或手动解决扩展方法:

object Parse {
  def apply[T](f: String => T) = new Parse[T](f)

  implicit val parseLong: Parse[Long] = Parse[Long](s => new StringOps(s).toLong)
  implicit val parseDouble: Parse[Double] = Parse[Double](s => new StringOps(s).toDouble)
  implicit val parseInt: Parse[Int] = Parse[Int](s => new StringOps(s).toInt)
}