Java 如何实例化int类型的堆栈数组?
Java 如何实例化int类型的堆栈数组?,java,arrays,stack,wildcard,towers-of-hanoi,Java,Arrays,Stack,Wildcard,Towers Of Hanoi,我试图创建一个堆栈数组,其中数组中的每个堆栈的类型都是int。 如果我像这样创建数组:Stack[]numbers=newstack[3],出现编译错误“无法创建堆栈的通用数组”。因此,我尝试创建通配符类型的堆栈数组,而不是Integer,然后它就没有这个错误了。 但是,如果我尝试将int按如下方式推入其中一个堆栈(通配符“?”类型):this.numbers[stackIndex].push(I),存在编译错误“类型堆栈中的方法push(capture#1-of?)不适用于参数(int)”
我试图创建一个堆栈数组,其中数组中的每个堆栈的类型都是
int
。
如果我像这样创建数组:
Stack[]numbers=newstack[3]代码>,出现编译错误“无法创建堆栈的通用数组”。因此,我尝试创建通配符类型的堆栈数组,而不是Integer
,然后它就没有这个错误了。
但是,如果我尝试将int
按如下方式推入其中一个堆栈(通配符“?
”类型):this.numbers[stackIndex].push(I)代码>,存在编译错误“类型堆栈中的方法push(capture#1-of?)不适用于参数(int)
”。
那么,如何正确地实例化int
类型的堆栈数组呢?到目前为止,我无法在这些堆栈上执行推/弹出操作。。。
我的理由是试图对河内塔游戏进行编程。我希望三根棒中的每一根都是int
类型的Stack
,每个环都表示为int
,三根棒一起包含在三个堆栈的数组中。
下面是一些示例代码:
import java.util.Stack;
public class StackTest {
Stack<?>[] numbers;
public StackTest(int stackLength) {
this.numbers = new Stack<?>[stackLength];
}
public void fillStack(int stackIndex, int numRings) {
for (int i = numRings; i >= 0; i--) {
// this statement has a compile error!
this.numbers[stackIndex].push(i);
}
}
public static void main(String[] args) {
int numberOfRods = 3;
StackTest obj = new StackTest(numberOfRods);
int rodNumber = 0, numberOfRings = 4;
obj.fillStack(rodNumber, numberOfRings);
}
} // end of StackTest
import java.util.Stack;
公共类堆栈测试{
堆栈[]编号;
公共堆栈测试(int stackLength){
this.numbers=新堆栈[堆栈长度];
}
公共空白填充堆栈(int stackIndex,int numRings){
对于(int i=numRings;i>=0;i--){
//此语句有编译错误!
这个.numbers[stackIndex].push(i);
}
}
公共静态void main(字符串[]args){
int numberOfRods=3;
StackTest obj=新的StackTest(棒数);
int rodname=0,numberOfRings=4;
对象填充堆栈(rodNumber,numberOfRings);
}
}//堆栈测试结束
它必须是原始的堆栈[]
,或者您可以使用列表lstStack=new ArrayList()
在这种情况下,我更愿意使用
List<Stack<Integer>> lstStack = new ArrayList<Stack<Integer>>(stackLength);
List lstStack=newarraylist(stackLength);
它必须是原始的堆栈[]
,或者您可以使用List lstStack=new ArrayList()
在这种情况下,我更愿意使用
List<Stack<Integer>> lstStack = new ArrayList<Stack<Integer>>(stackLength);
List lstStack=newarraylist(stackLength);
一种解决方案可以是:
public class StackInteger extends Stack<Integer> {
}
甚至:
Stack<Integer>[] numbers = new StackInteger[3];
Stack[]number=新的StackInteger[3];
一种解决方案可以是:
public class StackInteger extends Stack<Integer> {
}
甚至:
Stack<Integer>[] numbers = new StackInteger[3];
Stack[]number=新的StackInteger[3];
我的猜测是您应该推送一个整数,而不是int
:
this.numbers[stackIndex].push(Integer.valueOf(i));
我的猜测是您应该推送一个整数而不是int
:
this.numbers[stackIndex].push(Integer.valueOf(i));
谢谢你的快速回复!但是,当我将其更改为原始堆栈[]
时,我收到警告“堆栈是原始类型。对泛型类型堆栈的引用应参数化”
”。是否有办法避免此警告?@IanCampbell是的,使用第二种方法。再次感谢@Luiggi,但是当我尝试第二种方法时,我得到了编译错误“类型列表不是泛型的;它不能用参数参数化”
@IanCampbell您确定使用的是java.util.List
?@IanCampbell请参阅,谢谢您的快速回复!但是,当我将其更改为原始堆栈[]
时,我收到警告“堆栈是原始类型。对泛型类型堆栈的引用应参数化”
”。是否有办法避免此警告?@IanCampbell是的,使用第二种方法。再次感谢@Luiggi,但是当我尝试第二种方法时,我得到了编译错误“类型列表不是泛型的;它不能用参数参数化”
@IanCampbell您确定使用的是java.util.List
?@IanCampbell请参考我喜欢这个解决方案,但是当我将第5行更改为堆栈编号时代码>和第8行到this.numbers=新堆栈[堆栈长度]
,我得到警告“类型安全:类型Stack[]的表达式需要未经检查的转换以符合Stack[]
”。我喜欢这个解决方案,但是当我将第5行更改为堆栈编号时代码>和第8行到this.numbers=新堆栈[堆栈长度]
,我得到警告“类型安全:类型Stack[]的表达式需要未经检查的转换才能符合Stack[]
”。感谢@sp00m,这很有趣,但是当我这样做时,我得到警告“可序列化类StackInteger没有声明类型为long的静态最终SerialVersionID字段
”感谢@sp00m,这很有趣,但是当我这样做时,我得到警告“可序列化类StackInteger没有在类声明上声明long类型的静态最终serialVersionUID字段。