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.
Теперь можно подумать, что первая версия более оптимальная, лучшая.И действительно, часто упоминается использование более косвенной формы.
Однако мне было показано, что вторая версия быстрее.Используется другая конструкция массива байтового кода.