List<Object> myList = new ArrayList<String>(); //(hint: no)
Map<Integer> myMap = new HashMap<int>(); // (hint: also no)
为什么上述声明中的陈述有误?
答案 0 :(得分:5)
对于第一个,因为Java泛型不是协变。所以你甚至不能这样做:
ArrayList<Object> myList = new ArrayList<String>();
有关详细信息,请参阅此文章:Java theory and practice: Generics gotchas。
对于第二个,您不能使用基元作为泛型类型。
答案 1 :(得分:5)
1)如果有人将一个Long添加到myList引用的列表中会发生什么?
2)你不能在那里有原语。
答案 2 :(得分:5)
让我们看一下第一个例子。想想你应该在List<Object>
上做的操作:添加,删除,检索任何对象。
您尝试使用可以添加,删除和仅检索字符串的集合来填充这些要求。
List<Object> myList = new ArrayList<String>();
// This should be valid based on the List<Object> interface but obviously
// MyClass isn't String...so what would the statement do?
myList.add(new MyClass());
第二个原因仅仅是因为Java中的泛型不支持基本类型。有关更多信息,请查看:
答案 3 :(得分:3)
第一个是不可能的。您可以使用通配符:
List<?> myList = new ArrayList<String>();
但现在,您的列表完全无法使用。添加,删除等不再编译:
myList.add(new Object()); // Error
myList.add("error"); // Error
您不能将基元(int
,double
,....)与泛型一起使用。你必须使用包装类:
HashMap<Integer> myHap = new HashMap<Integer>();
答案 4 :(得分:1)
对于第二个示例,Map有2个通用参数,Key和Value,但以下内容仍无效
Map<Integer,Object> myMap = new HashMap<int,Object>();
因为如前所述原始类型不适用于java泛型(除了泛型类型总是从Object派生并且类型擦除会将所有泛型变量转换为Object类型)
答案 5 :(得分:1)
对于Java-Generics的所有内容,请参阅Angelika Langer。在这种情况下,Is List<Object> a supertype of List<String>?
即使Java支持自动装箱,它也不会自动将<int>
转换为<Integer>
。 IMO这部分是为了提醒用户你可以获得空值。