У мене виникають проблеми з навігацією правила Java для виведення параметрів загального типу. Розглянемо наступний клас, у якого є необов'язковий параметр списку:
import java.util.Collections;
import java.util.List;
public class Person {
private String name;
private List<String> nicknames;
public Person(String name) {
this(name,Collections.emptyList());
}
public Person(String name,List<String> nicknames) {
this.name = name;
this.nicknames = nicknames;
}
}
Мій компілятор Java видає таку помилку:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Але Collections.emptyList()
тип повернення <T> List<T>
, ні List<Object>
. Додавання амплуа не допомагає
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
врожайність
Person.java:9: inconvertible types
Використання EMPTY_LIST
замістьemptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
врожайність
Person.java:9: warning: [unchecked] unchecked conversion
Враховуючи, що наступна зміна призводить до помилки:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
Хто-небудь може пояснити, яке правило перевірки типу я тут наштовхую, і найкращий спосіб обійти це? У цьому прикладі підсумковий приклад коду є задовільним, але з більшими класами я хотів би мати можливість записувати методи, керуючись цим шаблоном "необов'язковий параметр" без дублювання коду.
Для додаткового кредиту: коли це доцільно використовувати EMPTY_LIST
на відміну від emptyList()
?