【发布时间】:2015-04-20 23:01:53
【问题描述】:
让我们举个例子让它更容易。我构建了一个列表,构造函数采用integer 和List<Integer>。我的列表将包含给定列表的所有元素乘以integer。我的列表不存储新元素,而是动态计算它们:
class MyList extends AbstractList<Integer> implements RandomAccess {
private final int multiplier;
private final List<Integer> list;
public MyList(int multiplier, List<Integer> list) {
this.multiplier = multiplier;
this.list = list;
}
@Override
public Integer get(int index) {
return list.get(index) * multiplier;
}
@Override
public int size() {
return list.size();
}
}
然后我们可以用list = [0, 1, 2, 3]调用new MyList(3, list)来获取[0, 3, 6, 9]。
我想限制开发人员向MyList 构造函数提供一个列表,该列表也是RandomAccess,以确保他不会破坏性能。
我试图改变构造函数:
public <E extends List<Integer> & RandomAccess> MyList(int multiplier, E list)
MyList 不是问题,但现在我们不能在不使用 List<Integer> 和 RandomAccess 的实现的情况下调用构造函数,例如 ArrayList<Integer>。所以有这个列表的人:List<Integer> list = new ArrayList<>(); 不能做new MyList(3, list);(因为它是用List<Integer> 而不是ArrayList<Integer> 声明的)。
我的另一个解决方案是:
public MyList(int multiplier, List<Integer> list) {
if(!(list instanceof RandomAccess)) {
// Do something like log or throw exception
}
this.multiplier = multiplier;
this.list = list;
}
但是现在我无法在编译时检查列表是否实现了RandomAccess,我需要使用instanceof,我讨厌这样做。
我很确定有更好的方法,但它是什么?
【问题讨论】:
-
尝试使用 | (或运算符)而不是 & (和运算符)。我不确定这是否可行,但值得一试。
-
所以如果你想将开发者限制在
RandomAccess“确保他不会破坏表演”,那么你为什么还要让他们调用你的带有List的构造函数,显然没有实现RandomAccess?这只是为了美观吗? -
我需要打电话给
List.get()。
标签: java list collections random-access