【发布时间】:2018-11-21 21:02:48
【问题描述】:
我正在尝试了解 scala 隐式及其在类型类中的用法。 我有一个通用特征 FromString 和一个伴随对象,它为标准类型定义了 FromString 的隐式实例,如下所示:
file: /src/main/scala/util/FromString.scala
package util
trait FromString[A] {
def fromString(string: String): A
}
object FromString {
def toFromString[T](p: String => T): FromString[T] = new FromString[T] {
def fromString(x: String): T = p(x);
}
implicit val IntFromString = toFromString[Int](_.toInt);
implicit val ByteFromString = toFromString[Byte](_.toByte);
implicit val LongFromString = toFromString[Long](_.toLong);
implicit val ShortFromString = toFromString[Short](_.toShort);
implicit val FloatFromString = toFromString[Float](_.toFloat);
implicit val DoubleFromString = toFromString[Double](_.toDouble);
implicit val BooleanFromString = toFromString[Boolean](_.toBoolean);
implicit val IntListFromString = toFromString[List[Int]](_.split(',').map(_.toInt).toList);
def convertFromString[A](string: String)(implicit e: FromString[A]): A = e.fromString(string)
}
现在我可以使用 FromString 对象的 convertFromString 函数将字符串转换为标准类型,如下所示。这运行正确。
file: /src/main/scala/top/Main1.scala
package top
import util.FromString._
object Main {
def main(args: Array[String]): Unit = {
val d = convertFromString[Double]("4.5");
val i = convertFromString[Int]("42");
val li = convertFromString[List[Int]]("1,2,3");
println(s"d=$d i=$i li=$li");
}
}
但是,当我尝试使用泛型类中的相同内容时,如下所示,它会导致错误could not find implicit value for parameter e: util.FromString[T]
file: /src/main/scala/util/Knob.scala
package util
import FromString._
class Knob[T](val name: String, default: T){
var value: T = default;
def update(valstr: String) {
value = convertFromString[T](valstr);
}
}
file: /src/main/scala/top/Main2.scala
package top
import util.Knob
import util.FromString._
object Main {
def main(args: Array[String]): Unit = {
val width = new Knob[Int]("Width", 3);
width.update("100");
println(s"width=$width");
}
}
隐式在对象中定义,我猜它们在范围内也可用。
【问题讨论】: