2014-02-19 4 views
1
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))) 
     } 
    } 

Каков правильный способ выполнения того, что делают хаки # 1 и # 2?Как использовать тип String в качестве параметра?

Я не могу понять, почему convert2 ("1", String) дает ошибку времени компиляции (с сообщением "объект java.lang.String не является значением"), тогда как convert2 ("1", Int) компилируется и работает отлично. Связано ли это с тем, что Int является родным типом Scala, а String является псевдонимом для java.lang.String?

ответ

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")) 
} 
+0

Идеальное решение! Огромное спасибо. –

0

Ваш код работает с Int, потому что есть объект с именем object Int, определенный где-то, то же самое не верно для String. Тем не менее, вы можете написать свой код, используя параметр типа, например:

def convert2[T](value: String): T = { 
    // do something... 
} 
Смежные вопросы