我正在测试下面显示的一些代码,这些代码基本上定义了多个隐式val
,它们将一个字符串作为输入并将其转换为相应的类型。
我遇到的问题是,由于某些原因,诸如toLong
,toDouble
和toInt
之类的转换无法解决。
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)
}
此代码有什么问题?
答案 0 :(得分:4)
问题在于,由于Parse
扩展了String => T
,隐式parseLong
,parseDouble
,parseInt
不仅定义了Parse
的实例,还定义了以及隐式转换String => Long
,String => Double
,String => 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)
}