2012-01-13 74 views
2

ClassManifest [T]是在Scala中主要用于创建阵列[T]秒。我可以为参数化类型构造一个ClassManifest而不需要清单类型参数吗?

林感兴趣其中阵列类型T不是原始的情况,但一些类,它类型构造,即AnyRef的子类型。然后,我可以为参数化类型构造一个ClassManifest,而不必为其类型参数进行清单化?

class Foo[A] 

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

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

+1

一些实验已经回答了我的问题: '高清manifestFor [A]:ClassManifest [富[A] =隐含[ClassManifest [富[A]]]'。 '用于隐式ClassManifest implicitly'搜索[美孚[A]]。我想编译器可以提供一个由于我上面提到的原因。 现在,回想起来这似乎是显而易见。我最初感到困惑,因为在我的应用程序中,我对类型不小心,并且使用了Manifest [T],而不是ClassManifest [T]。 舱单[T]意味着更高的精确度; T型的所有部件都必须是已知的。即,这是一个编译错误: 'def manifestFor [A]:Manifest [Foo [A]] =隐式[Manifest [Foo [A]]]' – 2012-01-13 01:54:15

+0

为什么隐式解决方案不合适? – Edmondo1984 2012-06-28 14:42:28

回答

0

您的评论是正确的,因为你已经强调,一个ClassManifest比清单“轻”,你可以从类型构造构建它。

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$(); 
} 
相关问题