ПРОГРАММИРОВАНИЕ JAVA: Сборник вопросов Linkedlistс - PullRequest
0 голосов
/ 25 февраля 2019

Можете ли вы объяснить, как

public default boolean addAll(Collection<? extends E> c)

конкретно

(Collection<? extends E> c)

и (Collection<?> c) работает?

Также, вы можете объяснить, что это значит:

public default <T> T[] toArray(T[] array)

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019
  • public default boolean addAll(Collection<? extends E> c)

Скажем, у вас есть class A и class B extends A.Тогда List<A>.addAll будет делать что-то вроде:

void addAll(Set<B> bs) {
    for (A a : bs) {
        add(a);
    }
}
  • public default <T> T[] toArray(T[] array)

Конечно, default позволяет иметь метод с реализацией в интерфейсе.

Для преобразования List<T> в массив T[] существует одна проблема: во время выполнения java type erasure означает, что существует только список объектов.Чтобы получить правильный класс для элементов массива, дизайн был изменен с

List<C>
C[] toArray()    // NOT possible, 

<T> T[] toArray(T[] sample)

Если параметр (sample здесь) имеет правильный размер, то этот массив берется, в противном случае создается новый массив.

List<String> list = ... // At runtime simply a List of Object.

String[] array = list.toArray(new String[list.size()]); // Created array taken.
String[] array = list.toArray(new String[0]); // New array created.

Теперь можно подумать, что первая версия более оптимальная, лучшая.И действительно, часто упоминается использование более косвенной формы.

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

0 голосов
/ 25 февраля 2019

(Collection<T extends E> c), Т а?может быть так же, особенно если?используется так (Collection <? extends E) c).Использование подстановочного знака здесь (Collection<? Extends E>) нарушается, поскольку теперь это относится к определенной иерархии объектов, а не для всех типов объектов

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

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

Подстановочный знак может быть любого типа.

public default <T> T[] toArray(T[] array) это где использование?совпадает с T, потому что тип T не определен, поскольку вы не можете использовать какой-либо специальный символ в именовании или указании типов, вы можете использовать T для замены?.это метод интерфейса, кто-то должен реализовать интерфейс, который имеет этот метод и предоставляет T, и T может быть LinkedList или любым Object.

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