以下代码将在toArray()
处抛出ArrayStoreException
。假如toArray
需要V[]
并且注册表Map键入的值为Map<String,String>
,那么编译器是否应该没有发现错误并报告了类型冲突?编译器是否应该在泛型集合中发现这个错误?
private Map<String,Map<String,String>> registry;
...
registry=new TreeMap<String,Map<String,String>>(String.CASE_INSENSITIVE_ORDER));
...
void removeTargets(String[] clsarr, String hdl) {
if(clsarr==null) { clsarr=registry.values().toArray(new String[0]); }
...
}
它看起来像一个编译器bug。
再一次,仿制药的支持“总比没有好,但留下了许多不足之处”。感谢您的解释。 – 2011-05-17 20:14:36
@软件猴子。是啊。广泛使用的编程语言中的类型系统存在漏洞,导致错误可能漏过。这不是由于任何理论上的限制,而是由于Java数组类型的早期设计,它决定通过说'String []'是一个Object []'来解决方差问题,这使得它很难工作类型到试图正确处理差异的泛型类型系统中。 – 2011-05-17 20:31:02