【问题标题】:Unchcked Cast Generics未经检查的演员泛型
【发布时间】:2011-05-01 03:41:59
【问题描述】:

在我的代码中,我有 private E[] arrCirc; 在我的构造函数中我有 arrCirc = (E[]) new Object[capacity]; 但是当我尝试编译它时,我得到一个警告:

[unchecked] 未经检查的演员表
找到:java.lang.Object
必需:E[]

错误,我不知道为什么。

public class Array12<E> implements LimCapList<E>{

  private int size = 0;
  private int capacity = 0;
  private int front;
  private int back;
  private E[] arrCirc;

  public Array12(int capacity){
     if( capacity <= 0)
       throw new IllegalArgumentException();
     arrCirc = (E[]) new Object[capacity];
     front = 0;
     back = 1;
  }

【问题讨论】:

    标签: java casting unchecked


    【解决方案1】:

    你能把你的arrCirc 设为Object[] 类型吗(就像openJDK 中的大多数generic collections 一样)?

    (然后做arrCirc = new Object[capacity];

    否则对于警告,您可以使用 SupressWarning。

            @SuppressWarnings("unchecked")
            public Array12(int capacity){
                 if( capacity <= 0)
                   throw new IllegalArgumentException();
                 arrCirc = (E[]) new Object[capacity];
                 front = 0;
                 back = 1;
              } 
    

    【讨论】:

    • 我的作业说我应该只有一个 int 类型的参数构造函数。否则我可以使用它。
    • 我将我的 arrCirc 设置为 Object[] 类型,但仍然收到警告。
    • @user 在这种情况下,您不需要转换为(E[])
    • 我怀疑这个铸造工作。你不能说对象数组是 E[] 类型。我认为这是有缺陷的。
    • @edalorzo 如果是Object[],则不会进行强制转换,但数组应该是私有的。就像数组可以包含任何东西Object[] arr = new Object[10]; arr[1] = "kjdklsf"; arr[2] = 1;。当然它不是类型安全的;您必须在 add、remove 和 get 方法中进行类型检查。
    【解决方案2】:

    Java 使用类型擦除来实现泛型,因此它无法在运行时知道 (E[]) 的含义,这就是为什么您会收到潜在不安全强制转换的警告。

    查看 Sun (erm... Oracle) 文档:http://download.oracle.com/javase/tutorial/java/generics/erasure.html

    您始终可以使用@SuppressWarnings(value = "unchecked") 使警告消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多