为了账号安全,请及时绑定邮箱和手机立即绑定

请教通用列表数组

请教通用列表数组

慕尼黑5688855 2019-12-02 08:04:23
通用列表数组我正在使用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);



查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 268 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信