【问题标题】:Java ArrayList remove method polymorphismJava ArrayList 移除方法多态性
【发布时间】:2011-07-26 16:19:31
【问题描述】:

我使用ArrayList<Integer>,我注意到有两种删除方法:

List接口继承的那个:

public boolean remove(Object o)

还有一个在ArrayList中实现:

public Object remove(int index)

就我而言,当我调用list.remove(2); 时,会调用哪个方法?为什么?因为我的“对象”也是一个整数......

谢谢。

【问题讨论】:

  • 这是一个虚假的问题,因为一个简单的测试会在大约一分钟内回答这个问题。
  • Thomas 打败了我 - 如果不确定这样简单的事情,请尝试一下。写一个简单的程序,看看结果如何。发布到 StackOverflow 所花费的时间大致相同。
  • 查尔斯·古德温打败了我 :-)
  • @Thomas Carpenter 关于调用哪个函数的问题可以在一分钟内回答,但关于为什么仍然需要回答的问题。
  • @bstick12 :在这种情况下,编译器会进行最具体的调用,这确实是对 int 索引的调用。看我的回答。

标签: java inheritance arraylist polymorphism


【解决方案1】:

如果你这样调用方法:

intList.remove(2);

第二个项目将被删除。 如果你这样调用方法:

intList.remove(new Integer(2)));

对象 2 将被移除。

【讨论】:

    【解决方案2】:
    public Object remove(int index)
    

    将被调用。

    由于您正在调用list.remove(2),因此参数的类型为 int。所以最具体匹配值的方法得到调用,在这种情况下,remove(int index)index处的值将被删除

    【讨论】:

    • 我要补充一点,这种不一致是 java collections api 重新设计的结果。
    • 好的,如果我需要调用其他方法,我可以以某种方式做到吗?也许将它上载到 List 所以另一种方法将是“最具体”的方法?
    • @Boris C: 或者你可以通过Integer.valueOf(2)
    • @Boris C - 不,该方法的另一种形式是当您有一个对象的实例要从列表中删除但不知道它在列表中的位置时。
    • @Boris C - 足够公平,但如果你有一个 Integer(2) 那么使用 remove(2) 仍然不起作用,因为编译器会将'2'视为一个 int 并始终删除该索引处的元素。只要目标对象的 equals() 方法正常运行,您的建议就会起作用。
    【解决方案3】:

    来自 ArrayList.remove(Object obj) 上的 JavaDocs:

    从此列表中删除指定元素的第一个匹配项, 如果它存在。如果列表不包含该元素,则为 不变。更正式地说,删除索引最低的元素 i 这样 (o==null ? get(i)==null : o.equals(get(i))) (如果这样 元素存在)。如果此列表包含指定的,则返回 true 元素(或等效地,如果此列表由于 打电话)。

    由于它使用 o.equals(),它要求包含的元素 A) 是一个对象,并且 B) 等于 remove() 参数。

    这里有一个示例来演示。

    /**
     * 
     */
    package ksf;
    
    import java.awt.List;
    import java.util.ArrayList;
    
    /**
     * @author Kelly French
     *
     */
    public class ListRemove {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ArrayList l = new ArrayList();
    
            l.add(new Integer(0)); // to take up the zeroth spot
            l.add(new Integer(300)); // 1st added, position [1]
            l.add(new Integer(100)); // 2nd added, position [2]
            l.add(new Integer(200)); // 3rd added, position [3]
    
            // will remove whatever is at location 2, i.e. Integer(100)
            l.remove(2); 
    
            // will remove first object Integer(200) if it exists
            //  in this case it is the equivalent of l.remove(3);
            l.remove(new Integer(200));
    
            // will cause nothing to be removed
            l.remove(200); // no 200th element in the list
            l.remove(new Integer(2)); // no element passes o.equals()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 2014-11-11
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多