I'm not entirely sure what you're asking for,
#2-4 should all fail to compile (numbering 1 is the top-most method, 4 is the bottom-most)
abstract class ABS<K extends Number>
{
public abstract <K> K useMe(Object k);// compiles fine...
public abstract <K> ABS<? extends Number> useMe(ABS<? super K> k) ; // fails to compile because ABS<? super K> could be declared to be something like ABS<Object>, which is always impossible. Also fails for the same reason #3 fails (generic type hiding)
public abstract <K> ABS<? super Number> useMe(ABS<? extends K> k); // fails to compile because K here is hidden by the method generic typing, and isn't the class generic typing. Will also fail because it must return ABS<? super Number>, which fails for the same reason #2 fails.
public abstract <K> ABS<K> useMe(ABS<K> k);// fails to compile by the same reason as #3.
public abstract <V> ABS<? extends Number> useMe(ABS<? super V> k); // equivalent statement for #2.
public abstract <V> ABS<? super Number> useMe(ABS<? extends V> k); // equivalent statement for #3.
public abstract <V> ABS<? extends Number> useMe(ABS<V> k); // equivalent statement for #4.
}