In the following, 'doesntCompile' doesn't compile. As you can see, it uses a wildcard in it's parameter. The method 'alsoCompiles' compiles, but uses a type variable in it's parameter. Various books I've read discuss that type variables (in generic methods) are needed to resolve issues between multiple parameters, or between a parameter and the method's return type. But in this case, there is only one parameter and the return type is void. So I don't understand why 'doesntCompile' won't compile. I'd appreciate it if someone could clarify this issue. Thanks in advance...
import java.util.Iterator;
public class Test {
class Bar<E> {}
public void m() {
compiles((Iterator<Bar<String>>) null);
alsoCompiles((Iterator<Bar<String>>) null);
doesntCompile((Iterator<Bar<String>>) null);
}
public void compiles(Iterator<?> x) {}
public <T> void alsoCompiles(Iterator<Bar<T>> x) {}
public void doesntCompile(Iterator<Bar<?>> x) {}
}