2012-01-13 77 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$(); 
} 
相關問題