Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala 2.10中的泛型类型解析器_Scala_Generics - Fatal编程技术网

scala 2.10中的泛型类型解析器

scala 2.10中的泛型类型解析器,scala,generics,Scala,Generics,我正在使用Scala 2.10编写一个通用值解析器。 输入是字符串,输出是用户给定的泛型类型 我唯一能想到的就是 val StringTYPE = classOf[java.lang.String] def parseValue[T: ClassTag](str: String): T = { implicitly[ClassTag[T]].runtimeClass match { case java.lang.Integer.TYPE => str.toInt.asInst

我正在使用Scala 2.10编写一个通用值解析器。 输入是字符串,输出是用户给定的泛型类型

我唯一能想到的就是

val StringTYPE = classOf[java.lang.String]

def parseValue[T: ClassTag](str: String): T = {
  implicitly[ClassTag[T]].runtimeClass match {
    case java.lang.Integer.TYPE => str.toInt.asInstanceOf[T]
    case java.lang.Long.TYPE => str.toLong.asInstanceOf[T]
    case StringTYPE => str.asInstanceOf[T]
    case _ => throw new Exception("Unknown type")
  }
}

但是它看起来非常冗长和复杂,所以我想知道有没有更简单的方法来实现这一点?

对编译时条件使用运行时错误似乎很奇怪。你考虑过一个类型类吗?

trait Readable[T] {
  def read(str: String): T
}

object Readable {


  implicit object IntIsReadable extends Readable[Int] {
    def read(str: String): Int = str.toInt
  }

  // ... provide similar objects for any types that can be "read" ...
  // if possible, inside object Readable 
  // or inside the companion object of the type you want to make readable. 
  // Otherwise, ensure that the implicit is in scope when calling Read
}


def readValue[T: Readable](str: String): T = implicitly[Readable[T]].read(str)

Aaron给出了解决方案,正确的方法是使用类型类

只是为了建议对您的版本进行一些小的改进(但不要这样做),您可以直接使用ClassTag进行检查。此外,命名隐式参数可能比隐式返回要容易:

def parseValue[T](str: String)(implicit tag: ClassTag[T]): T = {
  if(tag == ClassTag.Int) str.toInt.asInstanceOf[T]
  else if(tag == ClassTag.Long) ...
  else if (tag == ClassTag(classOf[String]) …
  else ???
}