【问题标题】:addAll() method from ArrayList <E> class does not workArrayList <E> 类中的 addAll() 方法不起作用
【发布时间】:2020-03-25 00:27:15
【问题描述】:

我很难理解为什么 ArrayList 中的 addAll() 方法不起作用。 我有我的课:

public class XList<E> extends ArrayList<E> {...

}

使用方法:

public XList<E> union(XList<E> input) {
    System.out.println(this);//
    System.out.println(input);
    this.addAll(input);
    return this;
}

System.out.println 表示,正确的值在给定的列表中,但是在添加之后,“this”没有得到更新,并且没有修改就返回。 你能告诉我问题的根源吗? 非常感谢任何帮助。

SSCCE:

public class Main {
public static void main(String[] args) {
    XList<Integer> list1 = new XList<>(1, 3, 9, 11);
    XList<Integer> list2 = XList.of(5, 6, 9);


    List<Integer> m1 = list1.union(list2);
    System.out.println(m1);

}

}

class XList<E> extends ArrayList<E> {

private List<E> lista;

public XList(E a, E b, E c) {
    lista = new ArrayList<>();
    lista.add(a);
    lista.add(b);
    lista.add(c);
}

public XList(E a, E b, E c, E d) {
    lista = new ArrayList<>();
    lista.add(a);
    lista.add(b);
    lista.add(c);
    lista.add(d);

}

static XList of(Integer a, Integer b, Integer c) {

    return new XList(a, b, c);
}

public XList<E> union(XList<E> input) {

    System.out.println("this: " + this);
    System.out.println("input: " + input);
    this.addAll(input);
    return this;
}


public String toString() {

    return lista.toString();
}

【问题讨论】:

  • this.addAll(input); 返回 true 吗?
  • 刚查了一下,没有……
  • 为了获得更好的帮助,请提供minimal reproducible example(又名SSCCE)——简短的代码示例,我们可以将其复制粘贴到我们的机器上,无需任何修改即可运行并重现您遇到的问题。这样我们就可以使用调试器等适当的工具来更容易地找到问题的根源。
  • 如果你已经有extends ArrayList&lt;E&gt;,为什么还要有private List&lt;E&gt; lista;?这样你就有了两个列表,一个在lista 下,一个在this 下,它们是单独的对象。
  • 可能最好的方法是让XList 不扩展ArrayList,而是让它扩展AbstractList。然后重写 get、size、set、add 和 remove 方法,并让它们委托给包含的 ArrayList。

标签: java arraylist collections


【解决方案1】:

您的问题是您的 XList 令人困惑地扩展了 ArrayList 并且还包含一个列表作为字段。这意味着 XList 基本上是两个单独的列表:它本身就是一个列表,它还包含一个不同的单独列表

如果我是你,我会删除“扩展 ArrayList”并替换

this.addAll(input);

this.lista.addAll(input.lista);

【讨论】:

  • 什么继承方法,你的意思是equals、hashCode、toString?覆盖这些是可选的。也许你跳过了remove "extends ArrayList"这句话?
  • 我确实忽略了你已经建议删除extends ArrayList
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2016-08-30
  • 2016-02-02
  • 2014-01-11
  • 1970-01-01
相关资源
最近更新 更多