警告:[unchecked]在使用Generic Array时取消选中

时间:2017-12-20 10:18:51

标签: java arrays generics

我正在创建自己的set类。但是一开始,我会发出警告。我在这个链接How to create a generic array?中使用。但我已经发出警告了。

这是我的警告信息:

MySet.java:11: warning: [unchecked] unchecked cast
        data = (T[]) new Object[10];
                     ^
  required: T[]
  found:    Object[]
  where T is a type-variable:
    T extends Object declared in class MySet
1 warning

这是我的初学者代码:

Main.java

public class Main{

    public static void main(String[] args){

        MySet<Integer> a = new MySet<Integer>();

        System.out.printf("empty or not = %d\n",a.empty());

    }

}

MySetInterface.java

public interface MySetInterface<T> {
    public int empty();
}

MySet.java

public class MySet<T> implements MySetInterface<T>{

private T[] data;
private int used;
private int capacity;

public MySet(){

    used = 0;
    capacity = 1024;
    data = (T[]) new Object[10];
}

public int empty(){

    if(used == 0){
        return 1;
    }
    else{
        return 0;
    }

}

如果我使用

@SuppressWarnings("unchecked")
        data = (T[]) new Object[10];

我现在收到此错误消息:

MySet.java:12: error: <identifier> expected
        data = (T[]) new Object[10];
            ^
1 error

1 个答案:

答案 0 :(得分:1)

如果您阅读了所提问题的答案,则会对警告显示的原因给出非常详尽的解释,并提供有效的解决方法。

  

上述代码具有与上述相同的含义。如果您注意到,编译器会在那里为您提供未经检查的强制转换警告,因为您要转换为未知组件类型的数组。这意味着,强制转换可能会在运行时失败。例如,如果您在上述方法中有该代码:

建议的类型安全代码。

public <E> E[] getArray(Class<E> clazz, int size) {
    @SuppressWarnings("unchecked")
    E[] arr = (E[]) Array.newInstance(clazz, size);

    return arr;
}

Explanation is provided in the answer