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存在型であるtype を持っているClass[_]ため、機能しません。これは、Classオブジェクトerasureが何らかの型によってパラメータ化されていることを意味しますが、これが正確にどの型であるかは重要ではありません。には上記erasureのタイプはありませんClass[T]

このメソッドは、のサブタイプであることがわかっているタイプfのパラメータを予期しています。この上限は、上記の型によって必ずしも保証されるわけではありません。Class[_ <: A]AClass[_]

解決策: に適切な型があることはわかっていますが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]
于 2012-07-06T00:57:03.057 に答える