Могу ли я создать ClassManifest для параметризованного типа, не имея манифестов для параметров типа? - PullRequest
2 голосов
/ 13 января 2012

ClassManifest [T] используются в Scala в основном для создания массивов [T].

Меня интересует случай, когда тип массива T не примитив, а некоторый класс, который принимает конструкторы типов, то есть подтип AnyRef. Могу ли я затем создать ClassManifest для параметризованного типа, не имея манифестов для его параметров типа?

class Foo[A]

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

Поскольку Foo не является примитивным, кажется, что хранилище массива JVM будет массивом ссылок, размер / размер памяти на который не влияют параметры стертого типа (например, A выше). Так что в теории это кажется возможным, но я не знаю, как написать это в Scala.

1 Ответ

0 голосов
/ 28 июня 2012

Ваш комментарий правильный, и, как вы подчеркнули, 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$();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...