The following statements:
URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class uclc = ucl.getClass();
Why can't assign I extends Type> to
?
Because actually extends Type> is a supertype of ! Let's follow the specification.
4.10.2 Subtyping among Class and Interface Types:
Given a generic type declaration C
1,...,Fn>, the direct supertypes of the parameterized type C 1,...,Tn> are all of the following:
- C
1,...,Sn>, where Si contains Ti.
4.5.1. Type Arguments of Parameterized Types:
A type argument T1 is said to contain another type argument T2, written T2 <= T1, if the set of types denoted by T2 is provably a subset of the set of types denoted by T1 under the reflexive and transitive closure of the following rules:
- T <= ? extends T
We therefore know that since ? extends URLClassLoader contains URLClassLoader, Class extends URLClassLoader> is a supertype of Class.
Because a narrowing reference conversion is not permitted within an assignment context, a compilation error occurs.
Also note that this means the reverse assignment is permitted:
Class concrete = URLClassLoader.class;
Class extends URLClassLoader> wildcard = concrete;