如何查找Scala表达式的类型

3

我可以在Scala中找到表达式的类型吗?这在调试复杂的部分函数、隐式转换等情况下特别有用...

例如:

println(  typeOf( x+y ) )  
2个回答

5
在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不具有抗擦除功能,因此您可能需要使用TypeTag(但这需要在类路径中拥有"scala-reflect.jar"):

import reflect.runtime.universe._
def exprType[T:TypeTag]( x: T ) = implicitly[TypeTag[T]]

谢谢。我认为这就是我要找的东西。所以...看起来在Scala中类型不是一等公民对象。我永远无法编写:exprType(x+y)==Int(就像在Python中一样)? - user48956
1
你可以执行 exprType(x+y) == typeTag[Int] - Régis Jean-Gilles
当然可以,但是Int不是一等对象。 - user48956

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]

如果您正在repl模式下,则

scala> :type List(1,2,3)
List[Int]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接