我有点疑惑:我想要一个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
}
他们可能认为在一些勉强相关的地方发出警告比没有任何警告更好。
答案 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>[]
}
}