Because some type information is erased during compilation, not all types are
available at run time. Types that are completely available at run time are known as
reifiable types. A type is reifiable if and only if one of the following holds:
• It refers to a non-generic type declaration.
• It is a parameterized type in which all type arguments are unbounded wild-
cards (§4.5.1).
• It is a raw type (§4.8).
• It is a primitive type (§4.2).
• It is an array type (§10.1) whose component type is reifiable.