这个问题在这里已有答案:
HashMap<String, ArrayList<? extends Serializable>> map = new HashMap<String, ArrayList<ArrayList>>();
这不编译。据我所知,Java Generics应该如此。还有这个:
ArrayList<? extends Serializable> c = new ArrayList<ArrayList<String>>();
成功编译。
任何人都可以说为什么以上不会编译?
为什么你认为它应该?只要HashMap<String, Apple>
和HashMap<String, Orange>
都不是通配符类型,Apple
永远不会从Orange
指定任何可能的不等Apple
和Orange
。
而ArrayList<? extends Serializable>
与ArrayList<ArrayList<?>>
不是一回事。
你可能意味着什么:
HashMap<String, ? extends ArrayList<? extends Serializable>> map =
new HashMap<String, ArrayList<ArrayList>>();
现在它编译,因为确实:
? extends Serializable // can be assigned from
ArrayList<?>
和
? extends ArrayList<? extends Serializable> // can be assigned from
ArrayList< ArrayList<?>>