The following statements:
URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<URLClassLoader> uclc = ucl.getClass();
fail with error:
Type mismatch: cannot convert from Class<capture#2-of ? extends URLClassLoader> to Class<URLClassLoader>
Why do I need a cast, here?
I found several posts explaining why You can't do the reverse (assign T to a ), but that's (kind of) obvious and understood.
NOTE: I am coding this under eclipse Luna, so I don't know if it's a Luna Quirk or if there's something I really dont understand in generics.
Covariance vs contravariance vs invariance
Class<? extends URLClassLoader>
is invariant.As a result,
Class<? extends URLClassLoader>
is not a subtype of Class<URLClassLoader>
In Java a variable can hold a reference of an instance of same type or subtype.
Hence,
Class<URLClassLoader> uclc = ucl.getClass();
is invalid.
On the other hand,
Class<? extends URLClassLoader> uclc = ucl.getClass();
would be valid.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With