В ваших трех примерах на самом деле происходит оптимизация памяти, потому что с пустым Collection
вы используете подмножество поведения класса, не полагаясь на то, что зависит от параметризованного типа, вы можете повторно использовать raw экземпляр.
Вы можете написать emptyList()
следующим образом
private static <T> List<T> emptyList() {
return new EmptyList<T>();
}
Единственная разница в поведении: Collections.emptyList() == Collections.emptyList()
вернет false.
Я не уверен, было ли это с именем , но с точки зрения документации, комментарий, говорящий о чем-то вроде «не требует параметризованного поведения, поэтому статический экземпляр может быть повторно использован», почти охватывает это.