ManifestFactory defines factory methods for manifests.
It is intended for use by the compiler and should not be used in client code.
Manifest, this factory isn't annotated with a deprecation warning.
This is done to prevent avalanches of deprecation warnings in the code that calls methods with manifests.
Why so complicated? Read up the comments for
Manifest for the abstract type
prefix # name.
upperBound is not
strictly necessary as it could be obtained by reflection. It was
added so that erasure can be calculated without reflection.
Manifest for the class type
a top-level or static class.
This no-prefix, no-arguments case is separate because we it's called from ScalaRunTime.boxArray itself. If we pass varargs as arrays into this, we get an infinitely recursive call to boxArray. (Besides, having a separate case is more efficient)