假设我需要提供一个带有 java.lang.Class
对象的方法,该对象表示某个父类 A
的子类。我需要从另一个方法执行此操作,该方法具有一个通用参数,其上限类型绑定(bind)到 A
。
我认为这可能有效:
class A
def f(clazz: java.lang.Class[_ <: A]) = ()
def g[T <: A : Manifest] = f(classManifest[T].erasure)
但事实并非如此:
<console>:9: error: type mismatch;
found : java.lang.Class[_$1(in method g)] where type _$1(in method g)
required: java.lang.Class[_ <: A]
def g[T <: A : Manifest] = f(classManifest[T].erasure)
^
为什么编译器无法判断出 T
实际上是 A
的子类?有什么我可以帮忙的吗?或者我应该以完全不同的方式处理这个问题?
最佳答案
它不起作用,因为 erasure
has the type Class[_]
,这是一种存在类型。这意味着Class
对象erasure
由某种类型参数化,但具体是哪种类型并不重要。 erasure
没有类型 Class[T]
如上所述。
方法f
需要 Class[_ <: A]
类型的参数这是已知为 A
子类型的某种类型。 Class[_]
不一定能保证这个上限。在上面输入。
解决方案:您知道 erasure
有一个正确的类型,只是这个类型没有在ClassManifest
中公开目的。只需转换它即可:
classManifest[T].erasure.asInstanceOf[Class[A]]
编辑:
如果你有一个子类B
的A
:
scala> class A
scala> def f(clazz: java.lang.Class[_ <: A]) = ()
scala> def g[T <: A : Manifest] = f(classManifest[T].erasure.asInstanceOf[Class[A]])
scala> g[A]
scala> class B extends A
scala> g[B]
关于scala - 使用 classManifest 提供具有上限类型界限的 Class 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354427/