如何使用String类型作为参数?

时间:2014-02-19 19:06:49

标签: string scala switch-statement

    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的别名有关?

2 个答案:

答案 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...
}