返回类型T的反射



我现在有这个:

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

这里不应该使用反射。相反,隐式,特别是类型-类模式,提供了一个编译时的解决方案:

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")
                                       ^

相关内容

  • 没有找到相关文章

最新更新