我正在尝试使用removeRange
方法从ArrayList
中删除某些元素。我从这里开始了解这个方法:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#removeRange(int, int)
然而当我尝试这样的时候
ArrayList<String> al = new ArrayList<String>();
al.add("AB");
al.add("BC");
al.add("CD");
al.add("DE");
al.removeRange(1, 3);
我收到了这个错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method removeRange(int, int) from the type ArrayList<String> is not visible
为什么我无法使用此方法?我做错了吗?
答案 0 :(得分:12)
简短的回答是:使用
al.subList(1, 3).clear();
removeRange(int, int)
方法为protected
。您只能从ArrayList
的子类或与ArrayList
相同的包中的类调用它。请参阅Controlling Access to Members of a Class。
访问removeRange
方法的唯一方法是继承ArrayList
并将方法设为公共。 E.g。
public class RangeRemoveSupport<E> extends ArrayList<E> {
public void removeRange(int fromIndex, int toIndex) {
super.removeRange(fromIndex, toIndex);
}
}
但是你的代码必须使用子类。因此,您的代码依赖于此子类,而不仅仅取决于List
或ArrayList
。
无法在同一个包中访问它的实用程序类。 E.g。
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”,我用“a,b,c,d,e”代替1..3,结果为:“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]
答案 1 :(得分:11)
由于它是受保护的方法,因此只对类,包和子类可见。
protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。
Modifier Class Package Subclass World
---------------------------------------------
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
答案 2 :(得分:3)
你可以使用:a1.subList(1,3).clear(); 这里已经讨论过:Why is Java's AbstractList's removeRange() method protected? 它可能会帮助您更好地理解。
答案 3 :(得分:0)
removeRange(int firstIndex, int lastIndex)
方法是protected
中的ArrayList<Object>
方法。受保护的方法在类,子类和包中访问,但不是公共的。