2

我有一种在 a 上运行的方法List,删除某些重复项。该算法仅对实现RandomAccess的列表有效。为了防止滥用和令人失望的表现,我想知道如何执行RandomAccess限制。不幸的是,RandomAccess接口没有扩展List,所以我有点需要同时使变量成为两种类型。

我可以将方法声明为 acceptArrayList而不是List,但其他列表类型也可以实现RandomAccess(例如,Collections.synchronizedListand返回的列表Collections.checkedList),我不想阻止这些。

我尝试了泛型,但无法构建有效的语法:

public <T> void process(<List<T> extends RandomAccess> list) {
    ...
}

我可以:

if (!(list instanceof RandomAccess))
    throw new UnsupportedOperationException("RandomAccess list required");

但随后该限制仅在运行时强制执行,这不太健壮。

帮助?

4

1 回答 1

4

您需要使用多个边界,由 & 号 ( &) 表示:

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) {

    }
}
于 2013-09-04T14:17:34.357 回答