Ich habe Probleme beim Navigieren in der Java-Regel zum Ableiten generischer Typparameter. Betrachten Sie die folgende Klasse mit einem optionalen Listenparameter:
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;
}
}
Mein Java-Compiler gibt den folgenden Fehler aus:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Aber Collections.emptyList()
kehren geben <T> List<T>
, nicht List<Object>
. Das Hinzufügen einer Besetzung hilft nicht
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
ergibt
Person.java:9: inconvertible types
Verwenden EMPTY_LIST
stattemptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
ergibt
Person.java:9: warning: [unchecked] unchecked conversion
Durch die folgende Änderung wird der Fehler behoben:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
Kann jemand erklären, gegen welche Regel zur Typprüfung ich hier stoße und wie ich sie am besten umgehen kann? In diesem Beispiel ist das endgültige Codebeispiel zufriedenstellend, aber bei größeren Klassen möchte ich in der Lage sein, Methoden zu schreiben, die diesem Muster "optionaler Parameter" folgen, ohne Code zu duplizieren.
Für zusätzliche Gutschrift: Wann ist es angebracht, EMPTY_LIST
im Gegensatz zu zu verwenden emptyList()
?