我想了解为什么当我尝试编译并运行以下程序时出现此警告,

时间:2015-07-16 09:43:40

标签: java arrays generics

我在这里包含了来源,任何人都可以帮助我理解它。

  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)");
     }
    }

这个程序是我使用Arrays的堆栈实现, 计划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 个答案:

答案 0 :(得分:2)

在我看来,提出警告的演员是无用的。您正在实例化Object[]并将其分配给声明为Object[]的变量,那么为什么要将其强制转换?您应该执行的唯一演员是pop方法中的演员。我认为在这种情况下的警告意味着编译器无法确保您正在做的事情是合法的,但程序仍然有效,因为您实际上正在向Object[]投射Object[]。据我所知,泛型不能与原始类型(即数组)一起使用,它只在Object中有用(即完整的类,在Java中它们都扩展java.lang.Object)。