ClassManifest [T]主要用于Scala创建Array [T]。
我感兴趣的是数组类型T不是原语但是某些类采用类型构造函数的情况,即AnyRef的子类型。然后我可以为参数化类型构造一个ClassManifest而不显示它的类型参数吗?
class Foo[A]
def getManifestFor[A]: ClassManifest[Foo[A]] = ???
由于Foo是非原始的,似乎JVM数组存储将是一个引用数组,其大小/内存布局不受擦除类型参数的影响(例如上面的A)。所以理论上似乎有可能,但我不知道如何在Scala中编写它。
答案 0 :(得分:0)
您的评论是正确的,正如您所强调的那样,ClassManifest比Manifest“更轻”,您可以从类型构造函数构建它。
scala> class Foo[A]
defined class Foo
scala> object test { def getManifestFor[A] = implicitly[ClassManifest[Foo[A]]] }
defined module test
scala> test.getManifestFor[Foo[Int]]
res2: ClassManifest[Foo[Foo[Int]]] = Foo[<?>]
scala> :javap -p test
Compiled from "<console>"
public final class test$ extends java.lang.Object implements scala.ScalaObject{
public static final test$ MODULE$;
public static {};
public scala.reflect.ClassManifest getManifestFor();
public test$();
}