Java определяет «?» Как неизвестный тип.Для универсального типа G экземпляр типа G является супертипом всех других экземпляров типа.
Переменные неизвестного типа не могут быть назначены и считаются объектами при чтении из.
public void foo(G<?> g) {
Object o = g.e; // Allowed
g.e = new Object(); // Not allowed
}
Например, печать всей коллекции:
void print(Collection<?> c) {
for(Object e: c) {
System.out.println(e);
}
}
Это работает, потому что коллекция является супертипом всех коллекций.
Предок неизвестного типа, помеченный G<? extends X>
, позволяет читать экземпляр неизвестного типа.
Потомок неизвестного типа, помеченный G<? super Y>
, позволяет писать в экземпляр неизвестного типа.