我正在尝试用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);
}
有人能帮我理解我做错了什么吗?提前致谢
答案 0 :(得分:3)
您的Collection
未实施。因此,您的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
而不是i
或if
而不是else
。)
忽略围绕for
- ,{{1}} - ,{{1}} - ,......身体的可选括号被视为不良做法。