在 Java 教程(http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html)中,我看到了以下内容:
// Not really allowed.
List<String>[] lsa = new List<String>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Unsound, but passes run time store check
oa[1] = li;
// Run-time error: ClassCastException.
String s = lsa[1].get(0);
If arrays of parameterized type were allowed, the previous example
would compile without any unchecked warnings, and yet fail at run-time
// OK, array of unbounded wildcard type.
List<?>[] lsa = new List<?>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Correct.
oa[1] = li;
// Run time error, but cast is explicit.
String s = (String) lsa[1].get(0);
然后他们解释说,如果我们切换List<String>[] lsa = new List<String>[10];
到那
List<?>[] lsa = new List<?>[10];
没关系,但我们必须向上转型。
我的一位教授就此提出以下问题:“为什么后者要编译?”
然后他给出了答案:“当参数是 ? 时,意思是数组中的每个单元格都可以包含一个 ArrayList。因为对泛型类的类型没有任何假设,所以前面的异常不会发生。”
通配符有效而前一个无效,这对我来说仍然没有任何意义。如果我们必须在通配符示例中强制执行向上转换,为什么我们不能在第一个示例中也这样做呢?
如果有人能为我解决这个问题,我将不胜感激。