Java 通用堆栈数组
我必须实现一个通用堆栈,但是当我尝试构建项目时,我有一个错误,我无法理解。代码如下: Stack.java->接口Java 通用堆栈数组,java,arrays,generics,stack,Java,Arrays,Generics,Stack,我必须实现一个通用堆栈,但是当我尝试构建项目时,我有一个错误,我无法理解。代码如下: Stack.java->接口 package stack; public interface Stack <T> { public boolean isEmpty(); public boolean isFull(); public void push(T x) throws StackFullException; public boolean offer(T x)
package stack;
public interface Stack <T> {
public boolean isEmpty();
public boolean isFull();
public void push(T x) throws StackFullException;
public boolean offer(T x);
public T pop() throws StackEmptyException;
public T poll();
public T peek() throws StackEmptyException;
public T element();
}
package stack;
public class StackArray <T extends Number> implements Stack {
static int max;
private int nr;
private T[] stack;
public StackArray(int size){
nr=0;
stack=(T[])(new Object[size]);
max=size;
}
public boolean isEmpty() {
if (nr<=0)
return true;
return false;
}
public boolean isFull() {
if (nr==max-1)
return true;
return false;
}
public void push(Object x) throws StackFullException{
if(isFull())
throw new StackFullException();
else
stack[nr++]=(T)x;
}
public boolean offer(Object x) {
if(isFull())
return false;
else
{
stack[nr++]=(T)x;
return true;
}
}
public T pop() throws StackEmptyException {
T aux=(T)(new Object());
if(isEmpty())
throw new StackEmptyException();
else
{
aux=stack[nr];
stack[nr]=null;
nr--;
return aux;
}
}
public T poll() {
T aux=(T)(new Object());
if(isEmpty())
return null;
else
{
aux=stack[nr];
stack[nr]=null;
nr--;
return aux;
}
}
public T peek() throws StackEmptyException {
if(isEmpty())
throw new StackEmptyException();
else
return stack[nr];
}
public T element() {
if(isEmpty())
return null;
else
return stack[nr];
}
}
包栈;
公共接口栈{
公共布尔值为空();
公共布尔值为full();
公共无效推送(TX)抛出StackFullException;
公开募股(tx);
public T pop()抛出StackEmptyException;
公众投票(;
public T peek()抛出StackEmptyException;
公共T元素();
}
StackArray.java->接口的实现
package stack;
public interface Stack <T> {
public boolean isEmpty();
public boolean isFull();
public void push(T x) throws StackFullException;
public boolean offer(T x);
public T pop() throws StackEmptyException;
public T poll();
public T peek() throws StackEmptyException;
public T element();
}
package stack;
public class StackArray <T extends Number> implements Stack {
static int max;
private int nr;
private T[] stack;
public StackArray(int size){
nr=0;
stack=(T[])(new Object[size]);
max=size;
}
public boolean isEmpty() {
if (nr<=0)
return true;
return false;
}
public boolean isFull() {
if (nr==max-1)
return true;
return false;
}
public void push(Object x) throws StackFullException{
if(isFull())
throw new StackFullException();
else
stack[nr++]=(T)x;
}
public boolean offer(Object x) {
if(isFull())
return false;
else
{
stack[nr++]=(T)x;
return true;
}
}
public T pop() throws StackEmptyException {
T aux=(T)(new Object());
if(isEmpty())
throw new StackEmptyException();
else
{
aux=stack[nr];
stack[nr]=null;
nr--;
return aux;
}
}
public T poll() {
T aux=(T)(new Object());
if(isEmpty())
return null;
else
{
aux=stack[nr];
stack[nr]=null;
nr--;
return aux;
}
}
public T peek() throws StackEmptyException {
if(isEmpty())
throw new StackEmptyException();
else
return stack[nr];
}
public T element() {
if(isEmpty())
return null;
else
return stack[nr];
}
}
包栈;
公共类StackArray实现堆栈{
静态int max;
私人国际天然气公司;
私有T[]栈;
公共堆栈数组(整数大小){
nr=0;
堆栈=(T[])(新对象[大小];
最大值=尺寸;
}
公共布尔值为空(){
如果(nr尝试将Main.java的第5行更改为:
StackArray stiva=新的StackArray(10);
(或者其他一些扩展数字的类型,如果您将StackArray标记为的话)的T[]
的上界是Number[]
,因为T
的上界是Number
。因此您的堆栈实际上被声明为Number[]
而不是对象[]
。在构造函数中,您试图将对象[]
分配给堆栈
。请创建一个编号[]
stack=(T[])(new Number[size]);
顺便说一句,你可能想
public class StackArray <T extends Number> implements Stack<T>
公共类StackArray实现堆栈
您不应该实现类的原始版本。因此,您需要更新其他方法(例如,push(t)
而不是push(Object)
)。更改
public void push(Object x)
到
我已经做了这些更改,现在出现了以下错误:线程“main”java.lang.ClassCastException中的异常:java.lang.Object不能在stack.StackArray.pop(StackArray.java:40)的stack.main.main(main.java:9)处转换为java.lang.Number。java结果:1第40行是T aux=(T) (new Object());为什么要尝试创建一个新对象,然后重新分配变量?Jus doT aux;
-无需初始化它(更不用说它是错误的)@Ionut:@Peter是对的。你完全没有理由需要在那里创建一个对象。@Peter Knego:谢谢!这就是问题所在。我已经改成了简单的T aux并开始工作。问题已经解决了!@Ionut:你有什么理由不想使用Java提供的Stack
或ArrayDeque
吗?你有什么特别的理由不想使用[Stack][1]或者[Deque][2]的实现?[1]:[2]:还有一件事;max
为空似乎没有什么好的理由;事实上,如果人们同时使用堆栈的两个实例,那么代码可能会灾难性地失败。
public void push(Number x) //or T