我可以找出 Scala 中表达式的类型吗?这在调试复杂的部分函数、隐式转换等时特别有用......
例如:
println( typeOf( x+y ) )
在 Scala 控制台中,您可以使用:type
:
:type x+y
在运行时(包括在控制台中),您可以执行以下操作:
scala> import reflect.ClassTag
import reflect.ClassTag
scala> def exprType[T:ClassTag]( x: T ) = implicitly[ClassTag[T]]
exprType: [T](x: T)(implicit evidence$1: scala.reflect.ClassTag[T])scala.reflect.ClassTag[T]
scala> exprType( x+y)
res1: scala.reflect.ClassTag[String] = java.lang.String
exprType 将返回ClassTag
参数。因为 ClassTag 对擦除没有弹性,您可能想要使用 aTypeTag
代替(但这需要在类路径中有“scala-reflect.jar”):
import reflect.runtime.universe._
def exprType[T:TypeTag]( x: T ) = implicitly[TypeTag[T]]
如果您希望按照指定的方式打印,则:
scala> def manOf[T: Manifest](t: T): Manifest[T] = manifest[T]
manOf: [T](t: T)(implicit evidence$1: Manifest[T])Manifest[T]
scala> val x = List(1,2,3)
x: List[Int] = List(1, 2, 3)
scala> println(manOf(x))
scala.collection.immutable.List[Int]
如果您处于 repl 模式,那么
scala> :type List(1,2,3)
List[Int]