Set实现中的addAll()方法不起作用

时间:2018-06-15 20:40:44

标签: java arraylist set

我正在尝试用Java中的ArrayList实现我自己的Set。我编写了方法add(),它负责在Set中添加一个新元素,方法contains,如果在Set和方法addAll中找到一个元素,则返回true,我想添加参数中的集合包含在Set中的所有元素。尽管如此,当我创建类Set的两个对象并在i上调用方法时,我在Eclipse上收到一条错误消息:The method addAll(Collection) in the type Set is not applicable for the arguments Set。这是我为目前为实现编写的代码:

import java.util.ArrayList;
import java.util.Collection;

public class Set<E>{
private ArrayList<E> List = new ArrayList<>();

public boolean add(E e) {
    if(contains(e))
        return false;
    return List.add(e);
}

public boolean addAll(Collection<E> e) {
    for(E i : e)
    {
        if(!List.contains(i)) {
            List.add(i);
        }   
    }
    return true;
}
 public boolean contains(E e) {
    return List.contains(e);
}

这是我实例化对象的类和调用它的方法:

public class NewClass
{   
   private Set setOne;
   private Set setTwo;

 public static void main(String[] args) { 
    setOne.addAll(setTwo);
}

有人能帮我理解我做错了什么吗?提前致谢

1 个答案:

答案 0 :(得分:3)

您的Collection未实施enter image description here。因此,您的Collection不是Set<E> implements Collection<E>

public boolean addAll(Set<? extends E> set)界面需要实现相当多的方法,但是如果你让Set并实现所有必需的方法,那么你的代码就可以运行。

作为快速和肮脏的修复方法,您可以向addAll(...)添加方法public boolean addAll(Collection<? extends E> e)

对您的代码的一些评论:

  • java.util.Collection interface之后,您可能希望将现有private ArrayList<E> List = new ArrayList<>();方法的签名更改为:

    private ArrayList<E> list = new ArrayList<>();
  • 在Java中,varialbe,attribute和method-names应以小写字母开头(collection - &gt; e)。

  • 您应该为变量和参数指定有意义的名称(例如entry而不是iif而不是else。)

  • 忽略围绕for - ,{{1}} - ,{{1}} - ,......身体的可选括号被视为不良做法。