Tengo problemas para navegar la regla de Java para inferir parámetros de tipo genérico. Considere la siguiente clase, que tiene un parámetro de lista opcional:Collections.emptyList() devuelve una lista <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;
}
}
Mi compilador Java da el siguiente error:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Pero Collections.emptyList()
Devuelve el tipo <T> List<T>
, no List<Object>
. La adición de un reparto no ayuda
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
produce
Person.java:9: inconvertible types
Usando EMPTY_LIST
en lugar de emptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
rendimientos
Person.java:9: warning: [unchecked] unchecked conversion
Considerando que el siguiente cambio MAK es el error desaparezca:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
¿Puede alguien explicar por qué regla verificación de tipos Estoy corriendo en contra de aquí, y la mejor manera de trabajar alrededor de ella? En este ejemplo, el ejemplo del código final es satisfactorio, pero con clases más grandes, me gustaría poder escribir métodos siguiendo este patrón de "parámetro opcional" sin duplicar el código.
Para obtener crédito adicional: ¿cuándo es apropiado usar EMPTY_LIST
en comparación con emptyList()
?
Para todas las preguntas relacionadas con Java Generics, recomiendo "[Java Generics and Collections] (http://oreilly.com/catalog/9780596527754/)" por Maurice Naftalin, Philip Wadler. –