Подтвердить что ты не робот

Объясните синтаксис Коллекций. <String> emptyList()

Я только что изучил обобщенное программирование, интерфейс List<E> и ArrayList, поэтому я могу понять приведенное ниже утверждение.

ArrayList<String> list = new ArrayList<String>();

Но я не понимаю следующее утверждение, которое я видел во время серфинга в Интернете.

List<String> list2 = Collections.<String>emptyList();
  • Что такое Collections? Почему это не Collections<E> или Collections<String>?
  • Почему <String> помещается перед именем метода emptyList?

(Не соответствует emptyList<String>() для Generic?)

  1. Что означает выражение?
4b9b3361

Ответ 1

Эта строка создает пустой список строк, вызывая статический метод с параметром общего типа.

Внутри класса Collections существует статический метод emptyList, объявленный как:

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

У этого есть параметр типового типа T. Мы вызываем этот метод, используя:

List<String> list = Collections.emptyList();

и T выводится как String из-за типа list.

Мы также можем указать тип T, поместив его в угловые скобки при вызове emptyList. Это может потребоваться, если мы хотим получить более конкретный тип, чем предполагалось:

List<? extends Object> list = Collections.<String>emptyList();

emptyList<String>() неверен, поскольку это размещение действует только при создании экземпляры родовых классов, а не вызывающие методы. При использовании new возможны два возможных варианта: параметры типа, перед именем класса для только конструктора, и те, которые указаны после имени класса для всего экземпляра, поэтому с классом:

class MyClass<A> {
    public <B> MyClass(A a, B b) {
        System.out.println(a + ", " + b);
    }
}

Мы можем назвать его конструктор, где A String и B есть Integer как:

MyClass<String> a = new <Integer>MyClass<String>("a", 3);

или с помощью вывода типа:

MyClass<String> a = new MyClass<>("a", 3);

См. также:

Ответ 2

Что такое Collections? Почему это не Collections<E> или Collections<String>?

Collections - это класс JDK.

Этот класс состоит исключительно из статических методов, которые работают или возвращать коллекции. Он содержит полиморфные алгоритмы, которые работают коллекции, "обертки", которые возвращают новую коллекцию, поддерживаемую указанную коллекцию и несколько других вариантов.

Он не является общим и не может быть создан.

Почему <String> помещается перед именем метода emptyList?

Collections#emptyList - общий метод. Здесь мы явно указываем аргумент типа String.

(Не соответствует ли emptyList<String>() для Generic?)

Нет, в Java общие аргументы типа для методов относятся к имени метода.

Что означает выражение?

Мы вызываем статический метод emptyList и присваиваем его возвращаемое значение переменной типа List<String>.

Ответ 3

В двух словах это создает пустой, неизменный список строк.

Посмотрим на выражение по биту.

Collections - это имя класса. Из Javadoc:

Этот класс состоит исключительно из статических методов, которые работают с коллекциями или возвращают их. Он содержит полиморфные алгоритмы, которые работают с коллекциями, "обертки", которые возвращают новую коллекцию, поддерживаемую указанной коллекцией, и несколько других коэффициентов и концов.

emptyList() - это имя статического метода, определенного в классе Collections (Javadoc). Это общий метод, а <String> in Collections.<String>emptyList() указывает общий аргумент типа.

Метод возвращает List<T>, который в этом случае List<String>: список строк. Более конкретно, он возвращает пустой, неизменный список строк.

Ответ 4

1.Collection - это интерфейс, а коллекции - статический класс, состоящий исключительно из статических методов, которые работают с коллекциями или возвращают их. Следовательно, мы не можем использовать Collections<E> или Collections<String>.

2. <String> before emptyList (используемый для получения неизменяемого пустого списка) означает, что к нему могут быть добавлены только значения String. Например:

list2.add("A");
list2.add("B");

3. Утверждение означает, что оно создаст неизменный пустой список типов List.

Вы можете проверить эту ссылку: Разница между сборкой Java и коллекциями

Ответ 5

Во-первых, Collections является вспомогательной библиотекой статических методов, которые работают с различными типами коллекций. Если вы сделали какое-либо программирование на С++, оно очень синонимом библиотеки функций <algorithm>.

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

Чтобы вызвать общий метод, вы должны вызвать его с помощью списка параметров (т.е. <String>) перед именем метода, но после точки.

List<String> someList = Collections.<String>emptyList();