Sto riscontrando problemi nella navigazione della regola di Java per inferire i parametri di tipo generico. Considera la seguente classe, che ha un parametro elenco opzionale:
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;
}
}
Il mio compilatore Java fornisce il seguente errore:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Ma Collections.emptyList()
restituisce il tipo <T> List<T>
, no List<Object>
. L'aggiunta di un cast non aiuta
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
i rendimenti
Person.java:9: inconvertible types
Usando EMPTY_LIST
invece diemptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
i rendimenti
Person.java:9: warning: [unchecked] unchecked conversion
Considerando che la seguente modifica fa scomparire l'errore:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
Qualcuno può spiegare quale regola di controllo del tipo sto incontrando qui, e il modo migliore per aggirare il problema? In questo esempio, l'esempio di codice finale è soddisfacente, ma con classi più grandi, mi piacerebbe poter scrivere metodi seguendo questo modello di "parametro opzionale" senza duplicare il codice.
Per un credito extra: quando è appropriato utilizzare EMPTY_LIST
invece di emptyList()
?