为什么这些在Java中无效?

时间:2011-06-08 14:33:26

标签: java

List<Object> myList = new ArrayList<String>(); //(hint: no)
Map<Integer> myMap = new HashMap<int>(); // (hint: also no)

为什么上述声明中的陈述有误?

6 个答案:

答案 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中的泛型不支持基本类型。有关更多信息,请查看:

java - Why don't Generics support primitive types?

答案 3 :(得分:3)

  1. 第一个是不可能的。您可以使用通配符:

    List<?> myList = new ArrayList<String>();
    

    但现在,您的列表完全无法使用。添加,删除等不再编译:

    myList.add(new Object()); // Error
    myList.add("error");      // Error
    
  2. 您不能将基元(intdouble,....)与泛型一起使用。你必须使用包装类:

    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这部分是为了提醒用户你可以获得空值。