java在实现类中而不是在接口中声明方法
首先,我对Java几乎没有经验 说到我的问题,我正在用我自己的方法实现我自己的列表java在实现类中而不是在接口中声明方法,java,methods,interface,implementation,Java,Methods,Interface,Implementation,首先,我对Java几乎没有经验 说到我的问题,我正在用我自己的方法实现我自己的列表 public class MyList<E> implements List<E>{ private Node<E> head; private static class Node<E> { private E element; ..... } 公共类MyList实现列表{ 专用节点头; 私有静态类节点{ 私人电子元件; ....
public class MyList<E> implements List<E>{
private Node<E> head;
private static class Node<E> {
private E element;
.....
}
公共类MyList实现列表{
专用节点头;
私有静态类节点{
私人电子元件;
.....
}
现在,此类中有一个方法将此列表与给定列表进行比较:
public boolean equals(List<E> list){
....
}
public boolean equals(列表){
....
}
要开始此方法,首先我们必须获取列表的标题,以便之后我可以访问元素并比较列表。现在,我们没有getHead()方法。 因此,我们尝试在实现类中创建以下方法
public Node<E> getHead(){
公共节点getHead(){
编译器找不到符号。当然,我们需要首先在接口中声明它。问题是,如果我们尝试这样做,接口不知道节点是什么。
所以我在这里陷入僵局
我得到一个错误:
Cannot find symbol
symbol : method getHead()
location: interface List<E>
Node<E> lhead = list.getHead();
找不到符号
符号:方法getHead()
位置:接口列表
节点lhead=list.getHead();
我希望它使getHead成为一个特定于实现的方法。我该怎么做
我问,我们可以将实现中的内部类移动到接口吗?
不知道怎么解决这个问题,
感谢您的时间getHead()
是一种特定于实现的方法,它不属于接口。但这也意味着您不能将其用作接口的一部分,您必须将其作为实现类的方法调用:
List<String> myList = new MyList<String>();
myList.getHead() // Wrong. Compiler error.
MyList<String> myList = new MyList<String>();
myList.getHead() // Works :)
List<String> asList = myList; // If you want to work with a List from now on
您是否正在实现或使用您创建的某个自定义列表
接口?如果您使用的是标准类,当然不能修改核心JDK类
如果您有一个自定义的列表
界面,我会看到一些问题:
- 您的方法应接受
和downcast。否则,您将重载而不是重写:对象
公共布尔等于(对象obj){ //先检查类型 列表=(列表)对象;
类是在节点
中私下定义的。将其放入MyList
界面,它将可公开访问列表
- 最后,通常定义
在内容方面,而不是在表示方面。您可能有几个equals()
实现,只要它们以相同的顺序保存相同的数据,列表就应该被认为是相等的。在您的实现中,只有使用列表
抽象的列表是相等的。而不是依赖head
,使用迭代器逐个比较项目getHead()
int getSize()
和E get(int index)
方法(这通常在list中可用)。
现在,您可以检查大小是否相等,如果相等,您可以遍历列表并逐个元素进行比较(使用eget(int index)
方法)
编辑:参考实现
public boolean equals(List<E> other) {
boolean equal = (getSize() == other.getSize());
for(int i = 0; i < getSize() && equal; i++) {
equal = get(i).equals(other.get(i));
}
return equal;
}
公共布尔等于(列出其他){
布尔值等于=(getSize()==其他.getSize());
对于(int i=0;i
你想把这个方法放在哪里?对我来说编译很好为什么不getHead()
returnE
?@MattBall What?head
是Node
的一个实例,因此getHead
应该返回Node
,否?@Alex Coleman我正试图将其放入实现类中。问题是,当我使用getHead时,它表示找不到符号。public boolean equals(列表){
通常等于方法不是这样。参数类型是对象
。它重载方法公共布尔等于(对象){
。尝试使用@Override
注释。我确实有getSize。但我需要gethead才能进行比较。由于某些原因,gethead()方法不是编译的。我不太理解gethead()方法的用途,因为您需要迭代所有元素来比较它们。事实上,您可以使用get来迭代列表(…)方法并比较元素本身。是的,但我必须比较head中的元素,如何在没有getHead的情况下访问另一个列表的head?@Alessandroempire:我添加了我的意思的引用实现!是的,但因此您有get()方法,该方法应在请求的索引处返回元素。如果索引为0,则应返回第一个元素,即head(如果有元素)。get(0)=head!get(1)=head.next,好的,让我试试。因为这是一个特定于实现的方法,出于某种原因,它不是编译的。问题是我需要在方法中使用getHead
public boolean equals(Object obj) {
//check type first
List<E> list = (List<E>)obj;
public boolean equals(List<E> other) {
boolean equal = (getSize() == other.getSize());
for(int i = 0; i < getSize() && equal; i++) {
equal = get(i).equals(other.get(i));
}
return equal;
}