Безопасные с точки зрения типов, универсальные, пустые Наборы со статическими дженериками

Я возвращаю пустые наборы по сравнению с пустым указателем, когда это возможно. Я переключаюсь между двумя методами для того, чтобы сделать настолько использующий java.util. Наборы:

return Collections.EMPTY_LIST;
return Collections.emptyList();

где emptyList() как предполагается, безопасен с точки зрения типов. Но я недавно обнаружил:

return Collections. emptyList();
return Collections. singletonList(new ComplexObject());

и т.д.

Я вижу этот метод в Проводнике пакетов Eclipse:

 () : void

но я не вижу, как это сделано в исходном коде (1.5). Как это волшебство tomfoolerie случай!!

Править: Как статический Универсальный тип выполняется?

10
задан Droo 12 April 2010 в 21:48
поделиться

4 ответа

EDIT: Как статический тип Generic реализован?

http://www.docjar.com/html/api/java/util/Collections.java.html

public class Collections {
    ...
    public static final List EMPTY_LIST = new EmptyList<Object>();
    ...
    public static final <T> List<T> emptyList() {
        return (List<T>) EMPTY_LIST;
    }
    ...
}

Вы можете посмотреть ссылку на реализацию класса EmptyList, если вам интересно, но для вашего вопроса это не имеет значения.

9
ответ дан 3 December 2019 в 15:35
поделиться
return Collections.<ComplexObject> emptyList();

Использование этого позволит избавиться от предупреждений Eclipse о неуниверсальных коллекциях.

При этом типизированный пустой список будет функционально идентичен нетипизированному пустому списку из-за того, что пустой список неизменен, а Java стирает общие типы во время компиляции.

16
ответ дан 3 December 2019 в 15:35
поделиться

- это имя метод, в который во время компиляции собирается код инициализации класса.(То есть весь код внутри static {} блоков и инициализаторы статических членов в порядке исходного кода.)

Это не имеет ничего общего с явными параметрами типа в вызовах методов.

1
ответ дан 3 December 2019 в 15:35
поделиться

- статический блок инициализатора. Это блок кода, который выполняется ровно один раз (при загрузке класса).

Итак, вместо

class  A  {
   static int x = 5;
}

можно написать:

class A {
   static int x;

   static {  // static initializer starts
      x = 5; 
   }
}

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

2
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

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