我是否可以为参数化类型构造ClassManifest而不显示类型参数?

时间:2012-01-13 01:42:10

标签: scala

ClassManifest [T]主要用于Scala创建Array [T]。

我感兴趣的是数组类型T不是原语但是某些类采用类型构造函数的情况,即AnyRef的子类型。然后我可以为参数化类型构造一个ClassManifest而不显示它的类型参数吗?

class Foo[A]

def getManifestFor[A]: ClassManifest[Foo[A]] = ???

由于Foo是非原始的,似乎JVM数组存储将是一个引用数组,其大小/内存布局不受擦除类型参数的影响(例如上面的A)。所以理论上似乎有可能,但我不知道如何在Scala中编写它。

1 个答案:

答案 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$();
}