猿问

请教通用列表数组

通用列表数组

我正在使用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>>();

但我无法弄清楚幕后的原因。特别是,为什么第二个是非法的,因为第一个是非常好的。为什么编译器不会抱怨列表列表。


慕尼黑5688855
浏览 269回答 3
3回答

Smart猫小萌

Array是穷人的泛型; 对于真正的泛型,人们应该避免使用数组,尽管并不总是可行的。数组是协变的,泛型是不变的; 结合擦除,事情恰好不适合,正如克里斯答案中的例子所示。但是我认为可以放宽规范以允许创建通用数组 - 那里确实没有问题。向上铸造阵列时会出现危险; 此时的编译器警告就足够了。实际上Java确实为vararg方法创建了通用数组,所以它有点虚伪。以下是利用这一事实的实用方法@SafeVarargsstatic <E> E[] arrayLiteral(E... array){&nbsp; &nbsp; return array;}@SafeVarargsstatic <E> E[] newArray(int length, E... array){&nbsp; &nbsp; return Arrays.copyOf(array, length);}// usage&nbsp; &nbsp; List<String>[] array1 = arrayLiteral(list, list);&nbsp; &nbsp; List<String>[] array2 = newArray(10);
随时随地看视频慕课网APP

相关分类

Java
我要回答