为什么 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[_]]
类型。
ClassTag[T]
return的runtimeClass
方法Class[_]
。我希望它 return 一个 Class[T]
,因为我们知道 ClassTag[T]
代表 T
.
为什么会 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[_]]
类型。