定义多个隐式值时无法解析符号 X
Cannot resolves symbol X, when defining multiple implicit vals
我正在测试下面显示的一些代码,这些代码基本上定义了多个隐式 val
s,将字符串作为输入并将其转换为相应的类型。
我遇到的问题是 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)
}
这段代码有什么问题?
问题在于,由于 Parse
扩展了 String => T
,隐式 parseLong
、parseDouble
、parseInt
不仅定义了 [=11= 的实例] 还有隐式转换 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)
}
我正在测试下面显示的一些代码,这些代码基本上定义了多个隐式 val
s,将字符串作为输入并将其转换为相应的类型。
我遇到的问题是 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)
}
这段代码有什么问题?
问题在于,由于 Parse
扩展了 String => T
,隐式 parseLong
、parseDouble
、parseInt
不仅定义了 [=11= 的实例] 还有隐式转换 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)
}