简短的答案是:使用
al.subList(1, 3).clear();
The removeRange(int, int)
方法是protected
。您只能从 的子类调用它ArrayList
或来自同一包中的类ArrayList
. See 控制对类成员的访问 https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html.
访问的唯一方法是removeRange
方法是子类化ArrayList
并将该方法公开。例如。
public class RangeRemoveSupport<E> extends ArrayList<E> {
public void removeRange(int fromIndex, int toIndex) {
super.removeRange(fromIndex, toIndex);
}
}
但是你的代码必须使用子类。因此你的代码依赖于这个子类而不仅仅是依赖于List
or 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
出于安全原因。
然而对于其他包来说这可能是一种方法。
我经常使用这种策略进行测试。然后,我将这样的实用程序类与生产代码放在同一个包中,以访问通常不应访问的测试中的一些内部结构。这是一种无需使用框架的简单方法。
EDIT
是否有一个功能可以将 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]