为什么这些在Java中无效?

Joh*_*per 3 java

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

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

Oli*_*rth 5

对于第一个,因为Java泛型不是协变的.所以你甚至不能这样做:

ArrayList<Object> myList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此文章:Java理论与实践:泛型陷阱.

对于第二个,您不能使用基元作为泛型类型.


Kaj*_*Kaj 5

1)如果有人在myList引用的列表中添加了Long,会发生什么?

2)你不能在那里有一个原始.


Jus*_*ner 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());
Run Code Online (Sandbox Code Playgroud)

第二个原因仅仅是因为Java中的泛型不支持基本类型.有关更多信息,您可以查看:

java - 为什么Generics不支持原始类型?