public class UnboundedWildcards2 { static Map mapl; static Map.?> map2; static Map
}
} ///-
Когда в записи используются
Ситуация осложняется тем, что компилятор не всегда интересуется различиями между List и List > (например), поэтому может показаться, что это одно и то же. В самом деле, поскольку параметризованный аргумент стирается до первого ограничения, List > кажется эквивалентным List
Когда же компилятор различает низкоуровневые типы и типы с неограниченными метасимволами? В следующем примере используется класс Holder
//: generics/Wildcards.java // Exploring the meaning of wildcards.
public class Wildcards {
// Низкоуровневый аргумент: static void rawArgs(Holder holder. Object arg) { // holder set(arg); // Предупреждение-// Непроверенный вызов set(T) как члена // низкоуровневого типа Holder // holder, set (new WildcardsO); // To же предупреждение
// Невозможно: нет информации о 'Т' // T t = holder.getO.
// Допустимо, но информация типа теряется Object obj = holder getO.
}
// По аналогии с rawArgsO, но ошибки вместо предупреждений, static void unboundedArg(Holder > holder. Object arg) { // holder.set(arg); // Ошибка: // set(capture of ?) in Holder
// Невозможно; нет информации о 'Т': // T t = holder.get();
// Допустимо, но информация типа теряется: Object obj = holder.getO;
}
static
}
static
}
static
T wildSubtype(Holder extends T> holder. T arg) { // holder.set(arg); // Ошибка: // set(capture of ? extends T) in // Holder
}
static
void wildSupertype(Holder super T> holder, T arg) { holder.set(arg);
// T t = holder.getO; // Ошибка:
// Несовместимые типы: обнаружен Object, требуется T
// Допустимо, но информация типа теряется: Object obj = holder get О;
}
public static void main(String[] args) {
Holder raw = new Holder
raw = new Holder(),
Holder
rawArgs(raw. Ing), rawArgs(qualified, Ing), rawArgs(unbounded. 1ng). rawArgs(bounded, Ing);
unboundedArg(raw, Ing), unboundedArg(qualified, Ing), unboundedArg(unbounded, Ing), unboundedArg(bounded, Ing),