Hi Simran, welcome to javaranch.
This questions has been asked before
here,
here and
here. Check those discussions. The trick is in the <K> part of the declarations of the methods.
abstract
<K> A<? extends Number> use( A<? super K> y);
abstract
<K> A<? super Number> use( A<? extends K> y) ;
You see that the bolded parts declare a new K which is not bound like the K declared at the class level, to clear things up, change the code like this
abstract <M> A<? extends Number> use( A<? super M> y);
abstract <M> A<? super Number> use( A<? extends M> y) ;