Преобразовать из Итератора <T>в Итератор <U>, где T является подклассом U - PullRequest
0 голосов
/ 29 января 2019

Учитывая класс T, который является подклассом U, безопасно ли приводить Iterator<T> к Iterator<U>?И если предположить, что приведение было безопасным, есть более элегантные (и без предупреждения) способы сделать это, кроме:

Iterator<T> it = <insert your Iterator<T> here...>;
Iterator<U> it2 = (Iterator<U>)(Iterator<? extends U>)it;

Я рассуждаю, почему приведение не опасно, таково:

  1. Iterator<?> не поддерживает вставку элементов, поэтому нет опасности испортить базовую структуру данных, используя Iterator<U> вместо Iterator<T>;
  2. Consumer<? super U> преобразуется в Consumer<? super T>но не наоборот.Следовательно, Iterator<U>::forEachRemaining(Consumer<? super U> action) примет подмножество всех действий, подходящих для того же метода в Iterator<T>, и, в частности, не вводит способ выполнения действий, не поддерживаемых Iterator<T>;
  3. Iterator<U>::remove() эквивалентно Iterator<T>::remove();
  4. Iterator<U>::next() возвращает суперкласс T;

1 Ответ

0 голосов
/ 29 января 2019

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

Я считаю, что

Iterator<U> it2 = (Iterator) it;

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

Возможно, любой используемый вами код, требующий Iterator<U>, должен быть реорганизован для принятия Iterator<? extends U>.

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