@Override声称Method不会重写,但是method表示它与父方法发生冲突

时间:2018-11-15 00:00:11

标签: java

我正在尝试使用预写的界面编写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语句生成一个错误,表明该方法没有覆盖我的接口中的那个,并且导致类中的方法声明,如果没有覆盖,则表示与接口的方法冲突。

2 个答案:

答案 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>();

然后enqueuestringQueue的{​​{1}}方法分别接受integerQueueString,都不能接受Integer作为参数,因此不能覆盖Object

最后对于enqueue(Object)来说,这很令人困惑,因为它说Error 2enqueue(T)发生冲突,但是enqueue(Object)不会覆盖enqueue(T)。由于erasure,这两种方法发生冲突。这意味着在运行时中,所有enqueue(Object)T取代。在这种情况下,程序将不知道执行哪种方法。 有关详细信息,请参见参考资料2。

参考:

1。What is a raw type and why shouldn't we use it?有关原始类型和相关内容的优秀问答

2。Java generics type erasure: when and what happens?

答案 1 :(得分:1)

通过Queue实现,如下定义您的QueuInterface类。

    public class Queue<T> implements QueueInterface<T> {

        @Override
        public void enqueue(T element) {

        }

    }