我正在尝试使用预写的界面编写Queue类。界面包含方法
public void enqueue(T element);
我的班级看起来像
import java.util.ArrayList;
public class Queue<T> implements QueueInterface {
ArrayList<T> list = new ArrayList<>();
public void enqueue(T element){
list.add(element);
}
}
当前,这导致该类生成一个错误,表明需要实现enqueue方法,而override语句生成一个错误,表明该方法没有覆盖我的接口中的那个,并且导致类中的方法声明,如果没有覆盖,则表示与接口的方法冲突。
答案 0 :(得分:2)
根据您提供的代码,有2个错误和1个警告。
警告1:
QueueInterface是原始类型。泛型类型QueueInterface的引用应参数化
错误1:
类型Queue必须实现继承的抽象方法QueueInterface.enqueue(Object)
错误2:
名称冲突:队列类型的方法enqueue(T)具有相同的名称 擦除为QueueInterface类型的enqueue(Object),但不删除 覆盖它
警告1 表示您应指定QueueInterface
的通用类型。在不指定类型参数的情况下,编译器将假定您正在实现类似
QueueInterface<Object>
(未完全参见参考文献1)。因此,您会看到错误1 ,因为enqueue(Object)
中没有方法实现/覆盖Queue
。
那为什么enqueue(T)
无法覆盖enqueue(Object)
?
将@Override
注释添加到enqueue(T element)
方法时,将显示另一个错误:
Queue类型的方法enqueue(T)必须重写或实现一个 超型方法
这是因为enqueue(T)
是泛型方法,并且T可以是任何类型。
例如,如果我们声明
Queue<String> stringQueue = new Queue<String>();
Queue<Integer> integerQueue = new Queue<Integer>();
然后enqueue
和stringQueue
的{{1}}方法分别接受integerQueue
和String
,都不能接受Integer
作为参数,因此不能覆盖Object
。
最后对于enqueue(Object)
来说,这很令人困惑,因为它说Error 2
与enqueue(T)
发生冲突,但是enqueue(Object)
不会覆盖enqueue(T)
。由于erasure,这两种方法发生冲突。这意味着在运行时中,所有enqueue(Object)
被T
取代。在这种情况下,程序将不知道执行哪种方法。
有关详细信息,请参见参考资料2。
1。What is a raw type and why shouldn't we use it?(有关原始类型和相关内容的优秀问答)
答案 1 :(得分:1)
通过Queue
实现,如下定义您的QueuInterface
类。
public class Queue<T> implements QueueInterface<T> {
@Override
public void enqueue(T element) {
}
}