在回答记者提问关于这里:https://stackoverflow.com/a/9872630/82609为什么我们可以使用阵列的通用参考
我试着做到以下几点:
Comparator<String>[] comparators = new Comparator[] {...};
它的工作原理!但是,下列情况不:
Comparator<String>[] comparators = new Comparator<String>[] {...};
论相关的问题,我的假设:
我想这是因为最初的阵列的合同可能是一些 这样的:
如果您创建了一个X类型的数组,那么您将永远无法将 中的任何东西放入IS-NOT-AN X中。如果您RY,你会得到一个ArrayStoreException信息
因此允许使用泛型创建阵列会导致像不同 规则:如果您创建
X<Y>
类型的数组,你永远不会能够到 把任何不是一个X.如果你尝试,你会得到一个 ArrayStoreException。但是,由于类型擦除,您可以添加
X<Y>
和X<Z>
对象!
但想着它,将它确实是一个问题有:
Comparator<String>[] comparators = new Comparator<String>[] {...};
我真的不明白为什么它是不可能的,因为使用这样的事情:
- 检查运行时插入的类
- 检查在编译时
插入最后,我们可以使用与一般类型的参考和,因为不可能创建一个泛型类型的数组的数组类型,我想很多人甚至不知道这是可能的。
我只是想知道是否有人知道背后的原因?
这是一个有点像强迫人们使用List<String> = new ArrayList();
,而不是使用List<String> = new ArrayList<String>();
dimitrisli你给约书亚布洛赫的名著一个很好为例。 正如你所解释的那样,使用通用数组+协方差都是危险的,并且可能导致ClassCastException,而我们期望使用协方差数组的ArrayStoreException。
但请注意以下几点仍然是合法的,并导致相同:
List<String>[] stringLists = new List[1];
List<Integer> intList = Arrays.asList(42);
Object[] objects = stringLists;
objects[0] = intList;
String s = stringLists[0].get(0);
但是它产生在编译时未检查铸警告,因为你mentionned,在运行一个ClassCastException。
可能重复的[错误通用数组创建](http://stackoverflow.com/questions/3903196/error-generic-array-creation) – 2012-03-27 09:16:25
@DaveWebb什么是重复的? – 2012-03-27 09:19:21
有人已经问过同样的问题。 http://stackoverflow.com/questions/3903196/error-generic-array-creation – 2012-03-27 09:24:45