Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用类清单提供类型上限为的类对象_Scala_Generics_Manifest_Type Erasure - Fatal编程技术网

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
object
erasure
由某个类型参数化,但具体是哪种类型并不重要。
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]