Итак, у меня есть класс со следующим конструктором:
public FilterList(Set<Integer> labels) {
...
}
и я хочу построить новый объект FilterList
с пустым множеством. Следуя совету Джошуа Блоха в своей книге "Эффективная Java", я не хочу создавать новый объект для пустого набора; Я просто использую Collections.emptySet()
вместо:
FilterList emptyList = new FilterList(Collections.emptySet());
Это дает мне ошибку, жалуясь, что java.util.Set<java.lang.Object>
не является java.util.Set<java.lang.Integer>
. ОК, как насчет этого:
FilterList emptyList = new FilterList((Set<Integer>)Collections.emptySet());
Это также дает мне ошибку! Хорошо, как насчет этого:
Set<Integer> empty = Collections.emptySet();
FilterList emptyList = new FilterList(empty);
Эй, это работает! Но почему? В конце концов, у Java нет вывода типа, поэтому вы получаете предупреждение о непроверенных преобразованиях, если вы делаете Set<Integer> foo = new TreeSet()
вместо Set<Integer> foo = new TreeSet<Integer>()
. Но Set<Integer> empty = Collections.emptySet();
работает даже без предупреждения. Почему это?