我目前有这个:
def stringToOtherType[T: TypeTag](str: String): T = {
if (typeOf[T] =:= typeOf[String])
str.asInstanceOf[T]
else if (typeOf[T] =:= typeOf[Int])
str.toInt.asInstanceOf[T]
else
throw new IllegalStateException()
如果可能的话,我真的很想没有.asInstanceOf [T](运行时)。这可能吗?删除asInstanceOf给了我一种Any的类型,这是有道理的,但由于我们使用反射并确定我返回的是T类型的值,所以我不明白为什么我们不能有T作为返回类型,即使我们在运行时使用反射。没有asInstanceOf [T]的代码块永远不会是T。
答案 0 :(得分:3)
你不应该在这里使用反射。相反,implicits,特别是类型类模式,提供了一个编译时解决方案:
trait StringConverter[T] {
def convert(str: String): T
}
implicit val stringToString = new StringConverter[String] {
def convert(str: String) = str
}
implicit val stringToInt = new StringConverter[Int] {
def convert(str: String) = str.toInt
}
def stringToOtherType[T: StringConverter](str: String): T = {
implicitly[StringConverter[T]].convert(str)
}
可以使用:
scala> stringToOtherType[Int]("5")
res0: Int = 5
scala> stringToOtherType[String]("5")
res1: String = 5
scala> stringToOtherType[Double]("5")
<console>:12: error: could not find implicit value for evidence parameter of type StringConverter[Double]
stringToOtherType[Double]("5")
^