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

Cha*_*nya 6 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);
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
The method removeRange(int, int) from the type ArrayList<String> is not visible
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*ink 13

简短的回答是:使用

al.subList(1, 3).clear();
Run Code Online (Sandbox Code Playgroud)

removeRange(int, int)方法protected.您只能从ArrayList同一个包中的类的子类调用它ArrayList.请参阅控制对类成员的访问.

访问该removeRange方法的唯一方法是子类化ArrayList并使该方法公开.例如

public class RangeRemoveSupport<E> extends ArrayList<E> {

  public void removeRange(int fromIndex, int toIndex) {
    super.removeRange(fromIndex, toIndex);
  }

}
Run Code Online (Sandbox Code Playgroud)

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

无法在同一个包中访问它的实用程序类.例如

package java.util; // <- SecurityException

public class RemoveRangeSupport {

    public static void removeRange(ArrayList<?> list, int from, int to){
       list.removeRange(from, to);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将导致一个 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);
Run Code Online (Sandbox Code Playgroud)

将输出

[0, a, b, c, d, e, 4]
Run Code Online (Sandbox Code Playgroud)


Sur*_*tta 12

由于它是受保护的方法,因此只对类,包和子类可见.

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
Run Code Online (Sandbox Code Playgroud)

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

  • 你不能.您可以删除一个元素,在循环中删除或查看sublist()方法.这可能有用. (2认同)