object UtilitiesHelper extends App {
override def main(args: Array[String]): Unit = {
def convert(value: String, targetType: Any): Any = {
targetType match {
case _: Int => value.toInt
case _: Float => value.toFloat
case _: Double => value.toDouble
case _: String => value
}
}
def convert2(value: String, targetType: Any): Any = {
targetType match {
case Int => value.toInt
case Float => value.toFloat
case Double => value.toDouble
// Hack #1
case _ => value
// Ideally we want
//case String => value
}
}
println(convert("1", 1))
println(convert("1.0", 1.0))
println(convert("Hello world", ""))
println(convert2("1", Int))
println(convert2("1.0", Double))
// Hack #2
println(convert2("Hello world", "".getClass()))
// Ideally we want
//println(convert2("Hello world", String)))
}
}
完成hack#1和#2正在做什么的正确方法是什么?
我无法弄清楚为什么convert2(“1”,String)给出编译时错误(消息“object java.lang.String不是值”)而convert2(“1”,Int)编译并运行完美。它是否与Int是Scala本机类型并且String是java.lang.String的别名有关?
答案 0 :(得分:2)
我想到了这样的事情。它有点复杂,但对我有用。
trait Converter[T] {
def convert(value: String): T
}
object ConvertExample extends Application {
implicit object IntConverter extends Converter[Int] {
def convert(value: String) = value.toInt
}
implicit object StringConverter extends Converter[String] {
def convert(value: String) = value.toString
}
def convert[T](value: String)(implicit converter: Converter[T]): T = converter.convert(value)
println(convert[Int]("3"))
println(convert[String]("asdasd"))
}
答案 1 :(得分:0)
您的代码与Int
一起使用,因为有一个名为object Int
的对象,在某处定义,String
不同。也就是说,您可以使用类型参数编写代码,如下所示:
def convert2[T](value: String): T = {
// do something...
}