实现接口的名称冲突

hel*_*Joe 4 java generics interface

我花了几个小时阅读关于泛型和类型擦除的Java文档/ Stackoverflow答案,但我仍然不完全理解该主题.问题是实现以下简单的界面:

public interface Stack {
void push(Object element); }
Run Code Online (Sandbox Code Playgroud)

我在一个简单的泛型类中实现了它:

public class NodeStack<T> implements Stack {
private Node<T> top;
private int size;

public void push(T value) {
    if(this.size == 0) {
        this.top = new Node<>(value, null);
    } else {
        this.top = new Node<>(value, this.top);
    }
    this.size++;}
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到编译器错误消息:

NodeStack.java:10: error: NodeStack is not abstract and does not override abstract method push(Object) in Stack
public class NodeStack<T> implements Stack {
   ^
NodeStack.java:63: error: name clash: push(T) in NodeStack and push(Object) in Stack have the same erasure, yet neither overrides the other

    public void push(T value) {
                ^
where T is a type-variable:
    T extends Object declared in class NodeStack
2 errors
Run Code Online (Sandbox Code Playgroud)

我认为这个问题是由于类型擦除而发生的 - 类中的push方法和接口中的push方法在类型擦除后具有相同的签名.我不明白为什么这会是一个问题.push方法实现应该与接口方法具有相同的签名,对吧?我在这里错过了什么?任何帮助是极大的赞赏.

小智 6

您正在尝试使用具有对象和通用T的方法签名,两者都不相匹配.

public interface Stack<T> 
{ 
    void push(T element); 
}
Run Code Online (Sandbox Code Playgroud)

现在你的NodeStack类将是

public class NodeStack<T> implements Stack<T> {
Run Code Online (Sandbox Code Playgroud)