2

假设我需要提供一个方法,该方法带有一个java.lang.Class表示某个父类的子类的对象A。我需要从另一个方法执行此操作,该方法具有一个上界类型绑定到的泛型参数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?无论如何我可以帮助它吗?或者我应该以完全不同的方式处理这个问题?

4

1 回答 1

3

它不起作用,因为它erasure具有 typeClass[_],它是一种存在类型。这意味着Class对象erasure被某种类型参数化,但它是哪种类型并不重要。上面erasure没有类型。Class[T]

该方法f需要一个类型的参数,Class[_ <: A]该参数是已知的某个类型的子类型A。此上限不一定由上述Class[_]类型确保。

解决方案:你知道erasure有一个正确的类型,只是这个类型没有暴露在ClassManifest对象中。简单地投射它:

classManifest[T].erasure.asInstanceOf[Class[A]]

编辑:

如果你有一个子BA

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]
于 2012-07-06T00:57:03.057 回答