为什么 ClassTag return 的方法 runtimeClass 是通配符 class?

Why does the method runtimeClass of ClassTag return a wildcard class?

ClassTag[T]return的runtimeClass方法Class[_]。我希望它 return 一个 Class[T],因为我们知道 ClassTag[T] 代表 T.

的(运行时)class

为什么会 return "any" Class?这有根本原因吗?

感谢 Eugene Burmako(通过 scala-internals),我们有以下反例:

scala> classTag[Array[_]].runtimeClass
res0: Class[_] = class java.lang.Object

Array[T] 不会在运行时擦除其类型参数(与其他泛型不同)。因此,不可能用准确的 Class 表示通配符 Array 类型。因此回退到 Object.

有趣的是,同样的论点适用于 classOf 的输入(正如@sjrd 提到的):

scala> classOf[Array[_]]
res0: Class[Array[_]] = class java.lang.Object

可以说 class java.lang.Object 不是 Class[Array[_]] 类型。

Post on scala-internals