Сегодня я натолкнулся на какой-то код, который мне показался сомнительным.Вот упрощенный пример (не реалистичный).
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);
}
Затем есть такой разработчик:
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;
}
}
Игнорируйте любые проблемы с реализацией, которые вы можете найти в этом (я нашел несколько тоже),Я понял, что интерфейс не использует какой-либо параметр общего типа для ArrayList (т.е. ArrayList), но реализует метод интерфейса (то есть ArrayList ).Другие разработчики могут возвращать ArrayLists с любыми другими параметрами типа, нет?
Итак, мои вопросы: это проблема?Должен ли я что-либо рефакторинг?Стоит ли оно того?В чем преимущество?С какими проблемами я могу столкнуться, если у меня есть метод, определенный в интерфейсе, тип возвращаемого значения которого является необработанным, но фактические разработчики метода возвращают различные параметризованные типы?