There is a subtle difference (which also depends on the exact definition of the term). "Supertype" implies "inheritance" and "inheritance" is only defined between classes in Java.

Technically, in castClassToUpperBound(Class<?> clazz, Class<U> upperBound), we check whether Class<?> is Class<? extends U>. In other words, by generic wildcard term, whether U is an upper bound of ?.