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)
| 归档时间: |
|
| 查看次数: |
952 次 |
| 最近记录: |