有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在我看来,提出警告的演员是无用的。您正在实例化一个Object[]并将其分配给一个声明为Object[]的变量,那么为什么要强制转换它呢?您应该执行的唯一转换是pop方法中的转换。我认为本例中的警告意味着编译器无法确保您所做的是合法的,但程序仍然可以工作,因为您确实在将Object[]强制转换为Object[]。就我所知,泛型不能与基元类型(即数组)一起使用,它只在Object中有用(即完全成熟的类,在Java中它们都扩展了java.lang.Object