如何使用泛型参数获取Scala运行时类?

时间:2015-12-11 15:42:06

标签: scala

我想知道是否可以做以下事情:

import scala.reflect.runtime.universe._
class Bar[T]
def foo[T]()(implicit ctag: reflect.ClassTag[T]) { 
  val clazz = classOf[Bar[ctag.runtimeClass.asInstanceOf[Class[T]]]] 
}

这里Scala编译器抱怨:

error: stable identifier required, but ctag.runtimeClass found.

有没有办法从函数中可用的运行时类型信息中插入类型参数的类类型?

2 个答案:

答案 0 :(得分:6)

  

有没有办法从函数中可用的运行时类型信息中插入类型参数的类类型?

classOf[Bar[T]]的工作原理非常简单:插入任何运行时信息! classOf[Bar[T]]classOf[Bar[String]]classOf[Bar[Int]]classOf[Bar[_]]都是一样的;这就是JVM上下文中类型擦除的含义(为了避免误导,我更喜欢在可能的情况下始终使用classOf[Bar[_]])。请注意,实际上只有一个例外:如果BarArray,则classOf[Array[Int]]classOf[Array[Object]](例如)不同!

classOf[T]显然需要运行时信息,所以它不起作用。

答案 1 :(得分:0)

感谢@Mr的评论。 V我意识到它实际上比我最初想的容易:

import scala.reflect.runtime.universe._
class Bar[T]
def foo[T]() { 
  val clazz = classOf[Bar[T]] 
}