Ich habe Probleme beim Navigieren der Java-Regel zum Ableiten generischer Typparameter. Betrachten Sie die folgende Klasse, die eine optionale Liste Parameter hat:Collections.emptyList() gibt eine Liste <Object> zurück?
Person.java:9: The constructor Person(String, List<Object>) is undefined
Aber Collections.emptyList()
kehrt Typ <T> List<T>
, nicht List<Object>
:
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 den folgenden Fehler gibt. Hinzufügen einer Guss nicht
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
hilft ergibt
Person.java:9: inconvertible types
Mit EMPTY_LIST
statt emptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
Erträge
Person.java:9: warning: [unchecked] unchecked conversion
Während die folgende Änderung mak es geht der Fehler weg:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
Kann mir jemand erklären, welche Art-Prüfregel Ich renne gegen hier, und der beste Weg, um es zu arbeiten? In diesem Beispiel ist das abschließende Codebeispiel zufriedenstellend, aber bei größeren Klassen würde ich gerne in der Lage sein, Methoden zu schreiben, die diesem "optionalen Parameter" -Muster folgen, ohne Code zu duplizieren.
Für zusätzliches Guthaben: Wann ist es angebracht, EMPTY_LIST
im Gegensatz zu emptyList()
zu verwenden?
Für alle Java Generics Fragen, empfehle ich "[Java Generics und Sammlungen] (http://oreilly.com/catalog/9780596527754/)" von Maurice Naftalin, Philip Wadler. –