加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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!

这显然不合适.编译器必须以相同的方式处理这两个,因此它们都使它们无效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读