今天我遇到了一些我覺得可疑的代碼。這是一個簡化的例子(不現實)。在返回集合的接口中使用Java泛型。最佳實踐?陷阱?
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 < GroceryList>)。其他的實現者可以返回任何其他類型參數的ArrayLists,否?
所以我的問題:這是一個問題嗎?我應該重構任何東西嗎?這值得麼?有什麼優勢?如果我在返回類型爲原始類型的接口中定義了一個方法,但是該方法的實際實現者返回了各種參數化類型,我可以遇到什麼樣的問題?
除了sfussenegger說的,我還希望方法返回'List'而不是'ArrayList'。 – 2010-02-10 18:41:32