Scala 使用类清单提供类型上限为的类对象
假设我需要提供一个带有Scala 使用类清单提供类型上限为的类对象,scala,generics,manifest,type-erasure,Scala,Generics,Manifest,Type Erasure,假设我需要提供一个带有java.lang.Class对象的方法,该对象表示某个父类a的子类。我需要从另一个方法执行此操作,该方法有一个泛型参数,其上限类型为a 我想这可能有用: A类 def(clazz:java.lang.Class[\up>它不起作用,因为它是一种存在类型。这意味着Classobjecterasure由某个类型参数化,但具体是哪种类型并不重要。erasure没有上面的类型Class[T] 方法f需要Class类型的参数[;我接受你的回答,因为你的解释既正确又清晰。但是,你的解
java.lang.Class
对象的方法,该对象表示某个父类a
的子类。我需要从另一个方法执行此操作,该方法有一个泛型参数,其上限类型为a
我想这可能有用:
A类
def(clazz:java.lang.Class[\up>它不起作用,因为它是一种存在类型。这意味着Class
objecterasure
由某个类型参数化,但具体是哪种类型并不重要。erasure
没有上面的类型Class[T]
方法f
需要Class类型的参数[;我接受你的回答,因为你的解释既正确又清晰。但是,你的解决方案对我不起作用,因为我的真实世界f
方法确实需要为子类型使用Class
对象,而不是A
。我自己的解决方案是放弃使用泛型,传递Class对象(通过调用路径中的classOf
获得),即对g
的调用现在看起来像:g[SomeSubclass](classOf[SomeSubclass])
(由于上面未显示的原因,仍然需要类型参数。)你完全正确。我很困惑,没有意识到即使你将B
的Class
对象作为Class[A]
的实例,它仍然是B
的Class
对象。谢谢!
<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)
^
classManifest[T].erasure.asInstanceOf[Class[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]