通用列表数组我正在使用Generic和数组,看起来下面的代码编译得很好,ArrayList<Key> a = new ArrayList<Key>();但是编译器抱怨这个,ArrayList<Key>[] a = new ArrayList<Key>[10];通过阅读stackoverflow中的帖子,我有点明白,这是由于类型擦除,我可以通过使用,修复它,ArrayList<Key>[] a = (ArrayList<Key> []) new ArrayList[10];或列表清单ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();但我无法弄清楚幕后的原因。特别是,为什么第二个是非法的,因为第一个是非常好的。为什么编译器不会抱怨列表列表。
3 回答
Smart猫小萌
TA贡献1911条经验 获得超7个赞
Array是穷人的泛型; 对于真正的泛型,人们应该避免使用数组,尽管并不总是可行的。
数组是协变的,泛型是不变的; 结合擦除,事情恰好不适合,正如克里斯答案中的例子所示。
但是我认为可以放宽规范以允许创建通用数组 - 那里确实没有问题。向上铸造阵列时会出现危险; 此时的编译器警告就足够了。
实际上Java确实为vararg方法创建了通用数组,所以它有点虚伪。
以下是利用这一事实的实用方法
@SafeVarargs
static <E> E[] arrayLiteral(E... array)
{
return array;
}
@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
return Arrays.copyOf(array, length);
}
// usage
List<String>[] array1 = arrayLiteral(list, list);
List<String>[] array2 = newArray(10);
添加回答
举报
0/150
提交
取消