在Scala中获取泛型类的类名

时间:2017-06-28 15:23:19

标签: scala

我有一个带有泛型类型T的函数readObjectFromFile。我怎么知道类型名称?

import scala.reflect.runtime.universe.{typeOf, TypeTag}

def name[T: TypeTag] = typeOf[T].typeSymbol.name.toString

name[Int]
res5: String = Int

import java.io._

def readObjectFromFile[T](file: File): T = {
  val typeName = name[T]
  println(s"read ${typeName} from file $file")
  val ois = new ObjectInputStream(new FileInputStream(file))
  val v = ois.readObject.asInstanceOf[T]
  ois.close()
  v
}

cmd19.sc:2: No TypeTag available for T
  val typeName = name[T]

ps:我知道我可以使用v.getClass.getName,但这可以在 读取对象后完成。我想在阅读对象之前打印这些信息。

1 个答案:

答案 0 :(得分:1)

readObjectFromFile也需要隐式TypeTag,以便name能够解决它。

import scala.reflect.runtime.universe.{typeOf, TypeTag}
import java.io._

def name[T: TypeTag] = typeOf[T].typeSymbol.name.toString

def readObjectFromFile[T: TypeTag](file: File): T = {
  val typeName = name[T]
  println(s"read ${typeName} from file $file")
  val ois = new ObjectInputStream(new FileInputStream(file))
  val v = ois.readObject.asInstanceOf[T]
  ois.close()
  v
}