以下代码可以编译通过,但是如果我取消注释掉的那一行,它就不能编译通过了,我感到困惑。HashMap确实继承了AbstractMap, 在声明map的第一行也可以编译通过。
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String args[]) {
Map<String, ? extends AbstractMap<String, String>> map = new HashMap<String, HashMap<String, String>>();
//map.put("one", new HashMap<String, String>());
}
}
我知道“正确的方法”是这样的:
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String args[]) {
Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();
map.put("one", new HashMap<String, String>());
}
}
List<Apple>
。由于类型擦除,Java无法识别,但这就是它创建的方式。我将编辑示例以显示更多为什么它不应该工作。 - Jon SkeetList<Fruit> list = new ArrayList<Fruit>();
。 - Jon SkeetList<? extends Fruit>
传递到一个方法中,它可以获取任何值并知道它是一个Fruit
,这可能是它所需要的全部。如果你传递一个List<? super Fruit>
,那么它知道它可以添加任何水果,但不知道它可以从列表中获取什么类型。 - Jon Skeet