gpt4 book ai didi

java - 使用通用链表但在弹出时强制使用(cast)

转载 作者:行者123 更新时间:2023-12-01 17:20:13 25 4
gpt4 key购买 nike

我非常高兴地说,我几周前刚刚在一个项目中实现了一个通用链表,并且它可以工作!但有一个问题。我被迫进行类型转换(并且没想到)。

这里有一些片段,我希望足以定义问题,从通用堆栈开始:

    public class GenericStack<E> {

public LinkedList <E> stack = new LinkedList<>();

public void push (E obj){
stack.add(obj);
}

public E pop() {
if (stack.isEmpty()) return null;
return stack.removeLast();
}
...
}

这是我使用通用堆栈的类定义:

public class Grid extends GenericStack<JTextField> implements ActionListener, KeyListener, KeyCodes

这是我定义的堆栈以及我要推送和弹出的内容:

  GenericStack stack = new GenericStack();
public static JTextField[][] cells = new JTextField[11][11];

这是我插入堆栈:

 stack.push(Grid.cells[currentCell.row][currentCell.col]);

这是我从堆栈中弹出的位置,仅当我执行所示的转换时才有效:

  private void calculate(){
JTextField w = new JTextField();
while(stack.size()>0){
w = (JTextField) stack.pop();
System.out.println("stack element " + w.getText());
}
}

现在我不再提示;我什至不确定是否存在需要处理的问题,但如果没有强制转换 (JTextField),我会得到“不兼容的类型 - 需要:JTextField; FOUND:对象”但是 stack.pop() 明确定义为返回通用类型,即 JTextField,那么为什么我需要强制转换?

最佳答案

这就是问题:

GenericStack stack = new GenericStack();

这是使用 GenericStack原始类型 。当你已经扩展 GenericStack<JTextField> 时,根本不清楚为什么你会得到这个。说实话。我希望您或者使用组合:

public class Grid implements ActionListener, KeyListener, KeyCodes {
private final GenericStack<JTextField> stack = new GenericStack<JTextField>();

private void calculate() {
while (stack.size() > 0) {
JTextField w = stack.pop();
System.out.println("stack element " + w.getText());
}
}
}

使用继承:

public class Grid extends GenericStack<JTextField> 
implements ActionListener, KeyListener, KeyCodes {

private void calculate() {
while (size() > 0) {
JTextField w = pop();
System.out.println("stack element " + w.getText());
}
}
}

目前您将两者混合在一起,这确实很奇怪。

关于java - 使用通用链表但在弹出时强制使用(cast),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19327399/

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