我有一种在List
上运行的方法,可以删除某些重复项。该算法仅对实现RandomAccess的列表有效。为了防止滥用和令人失望的性能,我想知道如何执行RandomAccess
限制。不幸的是,RandomAccess
接口不会扩展List
,因此我需要一次使变量成为两种类型。
我可以声明该方法接受ArrayList
而不是List
,但是其他列表类型也可以实现RandomAccess
(例如,Collections.synchronizedList
和Collections.checkedList
返回的列表),我不想阻止那些。
我尝试了泛型,但无法构造有效的语法:
public <T> void process(<List<T> extends RandomAccess> list) {
...
}
我可以做:
if (!(list instanceof RandomAccess))
throw new UnsupportedOperationException("RandomAccess list required");
但是,此限制仅在运行时强制执行,因此不够鲁棒。
救命?
最佳答案
您需要使用多个与号(&
)表示的界限:
public <T,L extends List<T> & RandomAccess> void process(L list)
将其放入(不可编译,除非您删除第二个调用)类:
public class Main {
public static void main(String[] argv)
throws Exception
{
Main x = new Main();
x.process(new ArrayList<String>());
x.process(new LinkedList<String>());
}
public <T,L extends List<T> & RandomAccess> void process(L list) {
}
}
关于java - 将方法限制为RandomAccess列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18616051/