简短的回答是:使用
al.subList(1, 3).clear();
removeRange(int, int) 方法是protected。您只能从ArrayList 的子类或从与ArrayList 相同的包中的类调用它。见Controlling Access to Members of a Class。
访问removeRange 方法的唯一方法是继承ArrayList 并将该方法公开。例如
public class RangeRemoveSupport<E> extends ArrayList<E> {
public void removeRange(int fromIndex, int toIndex) {
super.removeRange(fromIndex, toIndex);
}
}
但是你的代码必须使用子类。因此,您的代码依赖于这个子类,而不仅仅是依赖于 List 或 ArrayList。
同一包中的实用程序类无法访问它。例如
package java.util; // <- SecurityException
public class RemoveRangeSupport {
public static void removeRange(ArrayList<?> list, int from, int to){
list.removeRange(from, to);
}
}
这将导致SecurityException
java.lang.SecurityException: Prohibited package name: java.util.
因为出于安全原因,您不能在java.util 中定义类。
不过对于其他软件包来说,这可能是一种方式。
我经常使用这种策略进行测试。然后我将这样一个实用程序类与生产代码放在同一个包中,以从通常无法访问的测试中访问一些内部结构。这是一种不使用框架的简单方法。
编辑
是否有一个函数可以将 X..Y 范围内的项目替换为可能不同大小的新项目?
例如:此列表“0,1,2,3,4”,我将 1..3 替换为“a,b,c,d,e”,结果为:“0,a,b ,c,d,e,4"。
List<String> list = new ArrayList<>(Arrays.asList("0", "1", "2", "3", "4"));
List<String> subList = list.subList(1, 4);
subList.clear();
subList.addAll(Arrays.asList("a", "b", "c", "d", "e"));
System.out.println(list);
会输出
[0, a, b, c, d, e, 4]