今天我遇到了一些我觉得可疑的代码。这是一个简化的例子(不现实)。在返回集合的接口中使用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