java我想了解为什么在编译和运行以下程序时会出现此警告,
我在这里包括了资料来源,有人能帮我理解吗
Program 1: TEST CLIENT
public class bl_stack_gtestClient{
public static void main(String[] args) {
bl_stack_array <String> s = new bl_stack_array <String> (20);
int i =0;
while (!StdIn.isEmpty()) {
String item = StdIn.readString();
if (!item.equals("-"))
s.push(item);
else if (!s.isEmpty()){
StdOut.print(s.pop() + " ");
}
}
StdOut.println("(" + s.size() + " left on stack)");
}
}
这个程序是我用数组实现的堆栈, 方案2:
public class bl_stack_array <E> {
private Object[] stack;
private int ptr=0;
public bl_stack_array(int capacity){
stack = (E[]) new Object[capacity];
}
public void push(E item){
stack[ptr++] = item;
}
public E pop(){
E temp = (E)stack[--ptr];
stack[ptr] = null;
return temp;
}
public boolean isEmpty(){
return ptr == 0;
}
public int size(){
return ptr;
}
public void print(){
for (int i =0; i < ptr ; i++ ) {
System.out.println(" "+stack[i]);
}
}
}
要在终端中编译
javac -Xlint -cp ".:stdlib.jar" bl_stack_array.java
javac -Xlint -cp ".:stdlib.jar" bl_stack_gtestClient.java
运行
javac -cp ".:stdlib.jar" bl_stack_gtestClient
我得到的警告是
bl_stack_array.java:5: warning: [unchecked] unchecked cast
stack = (E[]) new Object[capacity];
^
required: E[]
found: Object[]
where E is a type-variable:
E extends Object declared in class bl_stack_array
bl_stack_array.java:11: warning: [unchecked] unchecked cast
E temp = (E)stack[--ptr];
^
required: E
found: Object
where E is a type-variable:
E extends Object declared in class bl_stack_array
2警告
请帮我理解这个警告,我真的不明白为什么会出现这个警告,但我还是做了演员, 但是这个程序运行得很好
有没有办法摆脱这个警告,。。。或者使用泛型数组[],E[],而不仅仅是基元
# 1 楼答案
在我看来,提出警告的演员是无用的。您正在实例化一个
Object[]
并将其分配给一个声明为Object[]
的变量,那么为什么要强制转换它呢?您应该执行的唯一转换是pop
方法中的转换。我认为本例中的警告意味着编译器无法确保您所做的是合法的,但程序仍然可以工作,因为您确实在将Object[]
强制转换为Object[]
。就我所知,泛型不能与基元类型(即数组)一起使用,它只在Object
中有用(即完全成熟的类,在Java中它们都扩展了java.lang.Object
)