Manifest defines factory methods for manifests.
It is intended for use by the compiler and should not be used in client code.
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)