如何查找Scala表达式的类型

use*_*956 3 scala

我可以在Scala中找出表达式的类型.在调试复杂的部分函数,​​隐式转换等时,这将特别有用......

例如:

println(  typeOf( x+y ) )  
Run Code Online (Sandbox Code Playgroud)

Rég*_*les 5

在scala控制台中,您可以使用:type:

:type x+y
Run Code Online (Sandbox Code Playgroud)

在运行时(包括在控制台中),您可以:

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
Run Code Online (Sandbox Code Playgroud)

exprType将返回ClassTag参数.因为ClassTag对擦除不具有弹性,所以您可能希望使用TypeTag替换(但这需要在类路径中使用"scala-reflect.jar"):

import reflect.runtime.universe._
def exprType[T:TypeTag]( x: T ) = implicitly[TypeTag[T]]
Run Code Online (Sandbox Code Playgroud)


Jat*_*tin 5

如果您希望按照指定打印,则:

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]
Run Code Online (Sandbox Code Playgroud)

如果你处于repl模式那么

scala> :type List(1,2,3)
List[Int]
Run Code Online (Sandbox Code Playgroud)