Ошибка несоответствия при объявлении переменной типа, определенного в универсальном классе - PullRequest
0 голосов
/ 06 июня 2018

Класс определяется как Header<Field<Column<Content<?>>>>{}, объявление переменной - Header<Field<Column<Content<String>>>> aHeader.Это дает ошибку BoundMismatch.Изменение декларации на Header<Field<Column<Content<?>>>> aHeader;удаляет ошибку, но теряет информацию о типе и, следовательно, не требуется.Какова стратегия, чтобы сделать эту работу?PS: определение класса должно сохранить?.

1 Ответ

0 голосов
/ 06 июня 2018

Переменная типа 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: классопределение должно сохранить?Я не вижу способа заставить его работать, кроме явного приведения.

Пока определение класса содержит подстановочный знак, вы никогда не сможете быть уверены, что это за тип.По этой же причине они не могут использоваться в качестве параметров типов классов.

То, что вас может заинтересовать, это просто обычная равнина Параметры общего типа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...