为什么removeRange方法的ArrayList类不起作用?

时间:2013-12-23 18:05:24

标签: java arraylist

我正在尝试使用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

为什么我无法使用此方法?我做错了吗?

4 个答案:

答案 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);
  }

}

但是你的代码必须使用子类。因此,您的代码依赖于此子类,而不仅仅取决于ListArrayList

无法在同一个包中访问它的实用程序类。 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>方法。受保护的方法在类,子类和包中访问,但不是公共的。