如何为新ArrayList <v> [N]指定项类型?

时间:2016-12-09 09:57:36

标签: java

我有点疑惑:我想要一个ArrayList-s数组,但我看不到指定ArrayList项类型:

class Test<V> {
    final static int N = 512;
    ArrayList<V> list1 = new ArrayList<>(); // ok
    ArrayList<V> list2 = new ArrayList<V>(); // ok

    ArrayList<V>[] lists1 = new ArrayList[N]; // <== warning:
    // Type safety: The expression of type ArrayList[] needs
    // unchecked conversion to conform to ArrayList<V>[]
    // Note that this line works because it's only a warning.

    ArrayList<V>[] lists2 = new ArrayList<V>[N]; // <== error:
    // Cannot create a generic array of ArrayList<V>

    ArrayList<V>[] lists3 = new ArrayList<>[N]; // <== error:
    // Incorrect number of arguments for type ArrayList<E>;
    // it cannot be parameterized with arguments <>

    ArrayList<V>[] lists4 = (ArrayList<V>[])new ArrayList[N]; // <== warning:
    //Type safety: Unchecked cast from ArrayList[] to ArrayList<V>[]

}

我看到了

的问题
    ArrayList<V>[] lists1 = new ArrayList[N];

是否未指定商品类型,但 如何指定?

编辑:答案they disallowed参数化类型的原始数组。他们可能希望程序员明确地对类型安全负责。或许他们感到不安,因为Test.f()编译没有任何警告:

    void f() {
        lists1[0] = new ArrayList<V>(); // ok

        //lists1[1] = new ArrayList<String>(); // <== error:
        // Type mismatch: cannot convert from ArrayList<String> to ArrayList<V>

        Object[] x = lists1;
        x[0] = new ArrayList<Integer>(); // ok
    }

他们可能认为在一些勉强相关的地方发出警告比没有任何警告更好。

5 个答案:

答案 0 :(得分:0)

在没有警告的情况下执行此操作的唯一方法只是ArrayList ArrayList s:

ArrayList<ArrayList<V>> list_of_lists = new ArrayList<>();
ArrayList<V> list = new ArrayList<>();
list_of_lists.add(list);

答案 1 :(得分:0)

数组和泛型之间存在一些根本区别。它们混合不好。

数组具体化,这意味着它们在运行时强制执行它的约束。 另一方面,泛型仅在编译时强制执行约束。并且它们在运行时删除类型信息。

由于这些差异,它们通常不能很好地混合。例如,以下表达式无效:

ArrayList<V>[] lists2 = new ArrayList<V>[N];

ArrayList<V>[] lists3 = new ArrayList<>[N];

ArrayList<V>[] lists3 = new ArrayList<String>[N];

虽然这个:

ArrayList<V>[] lists1 = new ArrayList[N];

合法但不安全。这意味着在运行时,它很可能会失败ClassCastException

答案 2 :(得分:0)

根据Oracle documentation

  

&#34;您无法创建参数化类型数组&#34;

相反,你可以做类似的事情:

List<List<ItemType>> var = new ArrayList<List<ItemType>>(size);

答案 3 :(得分:0)

只是你不能这样做。您可以创建列表列表或一组列表,但不能创建列表数组。

答案 4 :(得分:-1)

您将在实例化Test类时指定它。虽然,这种结构应该放在一个特定的类中,所以你的泛型参数将由新类处理,并且在测试中使用它时不会有任何麻烦

修改: 这就是为什么我的想法就像是

public class ArrayOfList<T> {

    private ArrayList<T>[] arrayLists;

    public ArrayList<T>[] getArrayLists() {
        return arrayLists;
    }


    public void setArrayLists(ArrayList<T>[] arrayLists) {
        this.arrayLists = arrayLists;
    }

}

public class Test {

    public void testArrayLists(){
        ArrayOfList<String> lists = new ArrayOfList<>();
        // lists contains a usable ArrayList<String>[]
    }
}