Java通用问题
发布时间:2020-12-15 08:40:16 所属栏目:Java 来源:网络整理
导读:下面的代码编译,但如果我取消注释注释行,它不会,我很困惑为什么. HashMap确实扩展了AbstractMap,并且声明map的第一行编译正常. import java.util.AbstractMap;import java.util.HashMap;import java.util.Map;public class Test { public static void main(S
下面的代码编译,但如果我取消注释注释行,它不会,我很困惑为什么. 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.put("one",String>()); } } 解决方法
第一个代码是不安全的 – 想象你真的写的:
HashMap<String,ConcurrentHashMap<String,String>> strongMap = new HashMap<String,String>>(); Map<String,String>> map = strongMap; 现在: map.put("one",String>()); ConcurrentHashMap<String,String> x = strongMap.get("one"); 我们应该有一个ConcurrentHashMap – 但实际上我们只有一个HashMap. 如果我们减少正在进行的泛型数量,这实际上要简单得多解释……你的场景实际上相当于(比如说): List<? extends Fruit> list = new List<Apple>(); list.add(new Apple()); 看起来没问题,直到你认为它的有效性(就编译器而言)相当于: List<Apple> apples = new ArrayList<Apple>(); List<? extends Fruit> list = apples; list.add(new Orange()); Apple apple = list.get(0); // Should be okay... but element 0 is an Orange! 这显然不合适.编译器必须以相同的方式处理这两个,因此它们都使它们无效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |