Lower bounded wildcard not checked against upper bounded type parameter
I wonder why does this piece of code compile successfully? Source code: abstract class A<K extends Number> { public abstract <M> A<? super M> useMe(A<? super M> k); } Compiled successfully How does it work and why does this compile? M is any type, so why it can be used?. Should it be: <M extends Number> ? This will not compile: abstract class A<K extends Number> { public abstract <M> A<? super M> useMe(A<M> k); } Error message: type argument M is not within bounds of type variable K where M, K are type variables: M extends Object declared in method useMe(A) K extends Number declared in class A