Переменная типа Header<Field<Column<Content<String>>>>
Может содержать только Header<Field<Column<Content<String>>>>
Она не имеет верхних или нижних границ, она может содержать только Header<Field<Column<Content<String>>>>
Header<Field<Column<Content<?>>>>
Представляет Header<Field<Column<Content<**unknown**>>>>
Как вы можете быть уверены, что при извлечении строки из неизвестного варианта вы всегда получите строку?Ты не можешьТаким образом, вы получаете сообщение об ошибке выше, чтобы предупредить вас, что вы не можете назначить коллекцию символов подстановки для строки.
Коллекции являются как производителями, так и потребителями.
Как общее правило, PECS: Producers Extend, Consumers Supers.
Мнемоническое устройство для запоминания границ.
Однако, коллекция действует как и то и другое, она может добавлять и выводить вещи,Итак, обычно они ограничены одним типом.
Можете ли вы добавить строку в коллекцию?
Нет.подстановочный знак - ограничение типа, говорящее, что это может быть коллекция любого типа.Это НЕ означает, что он может содержать каждого типа.
Так, для чего подстановочные знаки хороши? https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
Показывает несколько хороших примеров,Они могут использоваться для ограничения типов самой коллекции, в отличие от определения коллекции как способной принимать любой объект.
Например,
public void addRectangle(List<? extends Shape> shapes) {
// Compile-time error!
shapes.add(0, new Rectangle());
}
Это ошибка компиляции, потому чтогарантия того, что формы - это набор вещей, которые расширяют Shape, это может быть List<Circle>
!
Где, как
public void addRectangle(List<Shape> shapes) {
shapes.add(0, new Rectangle());
}
Работает нормально, поскольку Rectangle - это форма,и фигуры теперь могут содержать любую форму.
Какова стратегия, чтобы сделать эту работу?
Сохранение ограничения "PS: классопределение должно сохранить?Я не вижу способа заставить его работать, кроме явного приведения.
Пока определение класса содержит подстановочный знак, вы никогда не сможете быть уверены, что это за тип.По этой же причине они не могут использоваться в качестве параметров типов классов.
То, что вас может заинтересовать, это просто обычная равнина Параметры общего типа