Scala ClassTag& classOf和类型参数。泛型的奇怪案例

时间:2017-07-03 18:11:48

标签: scala generics reflection

这是我的代码直接&简单:

package scalaproj
import scala.reflect._

case class MyClass() {}

def bar[T](cls : Class[T]) = println(cls)
def foobar[T: ClassTag] = println(classTag[T])

bar(classOf[MyClass])
foobar[MyClass]

Results: class scalaproj.GetFields$MyClass$2
         scalaproj.GetFields$MyClass$2 

现在我想在没有着名错误的情况下执行以下操作:“需要类类型但是找到T”

def foo[T] = println(classOf[T])
foo[MyClass]

foo只是一个采用通用类型参数而不需要值参数的函数。我认为这很奇怪,因为这两个例子有效,所有的灵活性都融入了Scala语言及其对泛型的处理。

更新

只是为了说明进一步的陌生感:

def foo1[T](t : T) = {}  // no compile error

def foo2[T](): List[T] = { List[T]() }  // no compile error

def foo3[T](): T = { T() }  // compile error: "not found: value T"

赞赏一个很好的解释。

1 个答案:

答案 0 :(得分:3)

您不能,因为classOf不适用于任意类型(并且您的T是任意类型)。

例如:

scala> classOf[Int with String]
<console>:15: error: class type required but Int with String found
       classOf[Int with String]
               ^

您可以使用ClassTag#runtimeClass实现相同的目标:

def foo[T: ClassTag] = println(classTag[T].runtimeClass)