A ClassTag[T] stores the erased class of a given type T, accessible via the runtimeClass
field. This is particularly useful for instantiating Arrays whose element types are unknown
at compile time.

ClassTags are a weaker special case of scala.reflect.api.TypeTags#TypeTags, in that they
wrap only the runtime class of a given type, whereas a TypeTag contains all static type
information. That is, ClassTags are constructed from knowing only the top-level class of a
type, without necessarily knowing all of its argument types. This runtime information is enough
for runtime Array creation.

A ClassTag[T] can serve as an extractor that matches only objects of type T.

A ClassTag[T] can serve as an extractor that matches only objects of type T.

The compiler tries to turn unchecked type tests in pattern matches into checked ones
by wrapping a (_: T) type pattern as ct(_: T), where ct is the ClassTag[T] instance.
Type tests necessary before calling other extractors are treated similarly.
SomeExtractor(...) is turned into ct(SomeExtractor(...)) if T in SomeExtractor.unapply(x: T)
is uncheckable, but we have an instance of ClassTag[T].