Типобезопасные, обобщенные, пустые коллекции со статическими обобщениями - PullRequest
10 голосов
/ 13 апреля 2010

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

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

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

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

и т.д.

Я вижу этот метод в Eclipse Package Explorer:

<clinit> () : void

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

EDIT: Как достигается статический тип Generic?

Ответы [ 4 ]

15 голосов
/ 13 апреля 2010
return Collections.<ComplexObject> emptyList();

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

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

9 голосов
/ 13 апреля 2010

РЕДАКТИРОВАТЬ: Как статический тип 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, если вам интересно, но для вашего вопроса это не имеет значения.

2 голосов
/ 13 апреля 2010

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

Итак, вместо записи

class  A  {
   static int x = 5;
}

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

class A {
   static int x;

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

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

1 голос
/ 13 апреля 2010

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

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

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