Что такое различие между <? супер E> и <? расширяется E>?

Проверьте эти badblocks команда из командной строки Linux. Обратитесь к странице справочника для получения дальнейшей информации: man badblocks.

Как пример, я работаю /sbin/badblocks /dev/sda ежемесячно для нахождения проблем. Я никогда не должен был использовать этот инструмент для фактической фиксации поврежденных секторов, вот почему я должен указать на Вас на страницу справочника.

BTW: Вы не можете зафиксировать файловую систему NTFS из Linux, Вам нужен Windows для этого. Yuo может однако проверить диск на сбойные блоки, как описано, и он может сделать некоторое перемещение поврежденных секторов (который не влияет на файловую систему).

135
задан Duncan Jones 16 September 2012 в 19:55
поделиться

5 ответов

Первый говорит, что это «некий тип, который является предком E»; второй говорит, что это «какой-то тип, являющийся подклассом E». (В обоих случаях E подходит.)

Значит, конструктор использует ? расширяет форму E , чтобы гарантировать, что когда он извлекает значений из коллекции, все они будут E или каким-то подклассом (то есть совместимым). Метод dryTo пытается поместить значения в коллекцию, поэтому коллекция должна иметь тип элемента E или суперкласс .

] В качестве примера предположим, что у вас есть подобная иерархия классов:

Parent extends Object
Child extends Parent

и LinkedBlockingQueue . Вы можете построить этот переход в List , который безопасно скопирует все элементы, потому что каждый Child является родительским. Вы не могли передать List , потому что некоторые элементы могут быть несовместимы с Parent .

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

175
ответ дан 23 November 2019 в 23:42
поделиться

определяет E как верхнюю границу: «Это может быть преобразовано в E ».

определяет E как нижнюю границу: « E может быть преобразовано в это».

52
ответ дан 23 November 2019 в 23:42
поделиться

Подстановочный знак с верхней границей выглядит как «? Extends Type» и обозначает семейство всех типов, которые являются подтипами Type, включая тип Type. Тип называется верхней границей.

Подстановочный знак с нижней границей выглядит как «? Super Type» и обозначает семейство всех типов, которые являются супертипами Type, включая тип Type. Тип называется нижней границей.

3
ответ дан 23 November 2019 в 23:42
поделиться

Вы можете поискать в Google термины контравариантность ( ) и ковариация ( ). Я обнаружил, что наиболее полезным при понимании универсальных шаблонов для меня было понимание сигнатуры метода Collection.addAll :

public interface Collection<T> {
    public boolean addAll(Collection<? extends T> c);
}

Так же, как вы хотели бы иметь возможность добавить String в List :

List<Object> lo = ...
lo.add("Hello")

Вы также должны иметь возможность добавить List (или любую коллекцию String s) через метод addAll :

List<String> ls = ...
lo.addAll(ls)

Однако вы должны понимать, что List и List не эквивалентны, и последнее не является подкласс первого. Что необходимо, так это концепция параметра ковариантного типа , т. Е. .

Когда у вас есть это, легко думать о сценариях, в которых вы также хотите контравариантность (проверьте интерфейс Comparable ).

7
ответ дан 23 November 2019 в 23:42
поделиться

Я попытаюсь ответить на этот вопрос. Но чтобы получить действительно хороший ответ, вам следует проверить книгу Джошуа Блоха «Эффективная Java» (2-е издание). Он описывает мнемоническое выражение PECS, что означает «Producer Extends, Consumer Super».

Идея состоит в том, что если вы кодируете общие значения из объекта, вам следует использовать extends. но если вы создаете новые значения для универсального типа, вам следует использовать super.

Так, например:

public void pushAll(Iterable<? extends E> src) {
  for (E e: src) 
    push(e);
}

И

public void popAll(Collection<? super E> dst) {
  while (!isEmpty())
    dst.add(pop())
}

Но на самом деле вам стоит почитать эту книгу: http://java.sun.com/docs/books/effective/

11
ответ дан 23 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: