让我们举个例子来简化它.我构建了一个列表,构造函数采用整数和List< Integer>.我的列表将包含给定列表的所有元素乘以整数.我的列表不存储新元素,而是动态计算它们:
class MyList extends AbstractList implements RandomAccess {
private final int multiplier;
private final List list;
public MyList(int multiplier, List 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]调用新的MyList(3,list)来得到[0,3,6,9].
我想限制开发人员给MyList构造函数一个也是RandomAccess的列表,以确保他不会破坏性能.
我尝试用以下方法更改构造函数:
public & RandomAccess> MyList(int multiplier, E list)
MyList不是问题,但现在我们不能在不使用List< Integer>的实现的情况下调用构造函数.和RandomAccess一样,ArrayList< Integer>.所以有这个列表的人:List< Integer> list = new ArrayList<>();不能做新的MyList(3,列表); (因为它使用List< Integer>而不是ArrayList< Integer>来声明).
我的另一个解决方案就是这个:
public MyList(int multiplier, List list) {
if(!(list instanceof RandomAccess)) {
// Do something like log or throw exception
}
this.multiplier = multiplier;
this.list = list;
}
但是现在我无法在编译时检查列表是否实现RandomAccess,我需要使用instanceof并且我讨厌这样做.
我很确定有更好的方法,但它是什么?