Простой класс:
class Pair<K,V> {
}
И несколько назначений:
Collection<Pair<String,Long>> c1 = new ArrayList<Pair<String,Long>>();
Collection<Pair<String,Long>> c2 = c1; // ok
Collection<Pair<String,?>> c3 = c1; // this does not compile
Collection<? extends Pair<String,?>> c4 = c1; // ok
почему пуля номер три не компилируется, а четвертая совершенно законна?
Ошибка компилятора:
Type mismatch: cannot convert from Collection<Pair<String,Long>> to Collection<Pair<String,?>>