Tôi đã gặp một số mã ngày hôm nay mà tôi thấy có vấn đề. Đây là một ví dụ đơn giản (không thực tế).Sử dụng Generics Java trong giao diện trả về bộ sưu tập. Thực hành tốt nhất? Cạm bẫy?
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);
}
Sau đó có một implementor như vậy:
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;
}
}
Bỏ qua bất kỳ vấn đề thực hiện bạn có thể tìm thấy trong đó (tôi tìm thấy một vài quá). Điều tôi nhận được ở đây là giao diện không sử dụng bất kỳ tham số kiểu generic nào cho ArrayList (ví dụ ArrayList <?>), Nhưng trình triển khai phương thức của giao diện (ví dụ: ArrayList < GroceryList>). Những người triển khai khác có thể trả về ArrayLists với bất kỳ tham số kiểu nào khác, không?
Vì vậy, câu hỏi của tôi: Đây có phải là sự cố không? Tôi có nên refactor bất cứ điều gì? Nó có đáng không? Lợi thế là gì? Tôi có thể chạy loại vấn đề nào nếu tôi có một phương thức được xác định trong giao diện có kiểu trả về là kiểu thô, nhưng những người triển khai thực tế của phương thức trả về các kiểu tham số khác nhau?
Bên cạnh những gì sfussenegger đã nói, tôi cũng muốn các phương thức trả về 'Danh sách' thay vì' ArrayList'. –