gpt4 book ai didi

java - @Override 声称 Method 没有覆盖,但是 method 说它与父方法冲突

转载 作者:行者123 更新时间:2023-11-29 04:14:18 31 4
gpt4 key购买 nike

我正在尝试使用预先编写的接口(interface)编写队列类。接口(interface)包含方法

public void enqueue(T element);

我的类(class)看起来像

import java.util.ArrayList;

public class Queue<T> implements QueueInterface {

ArrayList<T> list = new ArrayList<>();

public void enqueue(T element){
list.add(element);
}
}

目前,这导致类生成一个错误,说明它需要实现 enqueue 方法,覆盖语句生成一个错误,说明该方法没有覆盖我接口(interface)中的方法,以及我类中的方法声明,没有覆盖,说它与接口(interface)的方法冲突。

最佳答案

错误解释如下:

根据您提供的代码,有 2 个错误和 1 个警告。
警告 1:

QueueInterface is a raw type. References to generic type QueueInterface should be parameterized

错误 1:

The type Queue must implement the inherited abstract method QueueInterface.enqueue(Object)

错误 2:

Name clash: The method enqueue(T) of type Queue has the same erasure as enqueue(Object) of type QueueInterface but does not override it

警告 1 告诉您应该指定 QueueInterface 的泛型类型.如果不指定类型参数,编译器将假定您正在实现类似 QueueInterface<Object> (不完全见引用文献1)。因此您会看到错误 1,因为没有方法实现/覆盖 enqueue(Object)Queue .

那为什么不能enqueue(T)覆盖 enqueue(Object) ?添加时 @Overrideenqueue(T element) 的注释方法,另一个错误将显示:

The method enqueue(T) of type Queue must override or implement a supertype method

这是因为 enqueue(T)是泛型方法,T 可以是任何类型。例如,如果我们声明

Queue<String> stringQueue = new Queue<String>();
Queue<Integer> integerQueue = new Queue<Integer>();

然后enqueue stringQueue的方法|和 integerQueue接受 StringInteger分别不能接受 Object作为参数,因此不能覆盖 enqueue(Object) .

最后是 Error 2 ,这很令人困惑,因为它说 enqueue(T)enqueue(Object) 相撞,但是 enqueue(T)不会覆盖 enqueue(Object) .这两种方法因为 erasure 而冲突.这意味着在运行时,所有TObject 取代.在这种情况下,程序将不知道要执行哪个方法。详见引用文献 2。

引用:

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

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

关于java - @Override 声称 Method 没有覆盖,但是 method 说它与父方法冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53310568/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com