我今天碰到了一些我发现有问题的代码.这是一个简化的例子(不现实).
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 groceries;
public GroceryList() {
this.groceries = new ArrayList();
}
public ArrayList getFirstNThings(int n) {
ArrayList firstNThings = new ArrayList();
for (int i=0; i < n; i++) {
firstNThings.add(this.groceries.get(i));
}
return firstNThings
}
public ArrayList getLastNThings(int n) {
ArrayList lastNThings = new ArrayList();
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,不是吗?
所以我的问题:这是一个问题吗?我应该重构一下吗?这值得么?有什么好处?如果我在返回类型为原始类型的接口中定义了一个方法,但是该方法的实际实现者返回各种参数化类型,我可以遇到什么样的问题?