Encontré un código hoy que encontré cuestionable. Aquí hay un ejemplo simplificado (no realista).Uso de genéricos de Java en interfaces que devuelven colecciones. ¿Mejores prácticas? Trampas?
public interface IListable {
//returns first n items from list
public ArrayList getFirstNThings(int n);
//returns last n items from list
public ArrayList getLastNThings(int n);
}
Entonces hay un implementador de este modo:
public GroceryList implements IListable {
private ArrayList<GroceryItem> groceries;
public GroceryList() {
this.groceries = new ArrayList<GroceryItem>();
}
public ArrayList<GroceryItem> getFirstNThings(int n) {
ArrayList<GroceryItem> firstNThings = new ArrayList<GroceryItem>();
for (int i=0; i < n; i++) {
firstNThings.add(this.groceries.get(i));
}
return firstNThings
}
public ArrayList<GroceryItem> getLastNThings(int n) {
ArrayList<GroceryItem> lastNThings = new ArrayList<GroceryItem>();
for (int i=this.groceries.size(); i < this.groceries.size()-n; i--) {
lastNThings.add(this.groceries.get(i-1);
}
return lastNThings;
}
}
ignorar cualquier problemas de implementación que puede encontrar en el que (me encontré con unos pocos también). Lo que quiero decir es que la interfaz no utiliza ningún parámetro de tipo genérico para ArrayList (es decir, ArrayList <?>), Pero el implementador del método de la interfaz sí lo hace (es decir, ArrayList < GroceryList>). Otros implementadores pueden devolver ArrayLists con cualquier otro tipo de parámetros, ¿no?
Entonces mis preguntas: ¿Esto es un problema? ¿Debería refacturar algo? ¿Vale la pena? ¿Cuál es la ventaja? ¿Con qué tipo de problemas puedo encontrarme si tengo un método definido en una interfaz cuyo tipo de devolución es un tipo sin procesar, pero los implementadores reales del método devuelven varios tipos parametrizados?
Además de lo que dijo sfussenegger, también preferiría que los métodos devuelvan 'List' en lugar de' ArrayList'. –