At first glance I thought the following makes sense:
interface Test<T> {
T getValue(T n);
}
class Impl implements Test<Integer>{
public Integer getValue(Integer n){
return n;
}
}
And it compiles properly so everything seems A-OK.
But then I thought about it some more, in the context of erasure, and it seems to me that the Test interface gets erased to this:
interface Test {
Object getValue(Object n);
}
So how is Impl still able to implement Test?