如何在Java中创建三维Liskov地图?

如何在Java中创建三维Liskov地图?,java,map,hashmap,type-inference,liskov-substitution-principle,Java,Map,Hashmap,Type Inference,Liskov Substitution Principle,我正试着把一张地图放到另一张地图上 Map<String, ? extends Map<String, String>> test = new HashMap<String, HashMap<String, String>>(); Map<String, String> temp = new HashMap<String, String>(); test.put("foobar", temp); Map test=newh

我正试着把一张地图放到另一张地图上

Map<String, ? extends Map<String, String>> test = new HashMap<String, HashMap<String, String>>();
Map<String, String> temp = new HashMap<String, String>();
test.put("foobar", temp);
Map test=newhashmap();
Map temp=newhashmap();
测试放置(“foobar”,温度);
但我收到的是:

类型映射>中的方法put(String,capture#1-of?extends Map)不适用于参数(String,Map)


Map
不一样吗?扩展映射

外部的
映射
测试使用一个上限通配符值,该通配符值阻止添加值,而
映射
临时则没有

你可以用

Map<String, Map<String, String>> test = new HashMap<String, Map<String, String>>();
            ^                                               ^
            |-----changed LHS type--- must be matched with -|                                               
Map test=newhashmap();
^                                               ^
|-----更改的LHS类型---必须与-|匹配
有界通配符语法
Map
表示
Map
使用扩展
Map
的某种未知类型的值。编译器阻止添加除
null
以外的所有值


另请注意,右侧的值有一个
Map
类型,而不是
HashMap
,因为泛型不是协变的,这意味着右侧赋值的泛型类型必须与左侧声明中的泛型类型完全匹配。

外部
Map
使用上通配符值这会阻止添加值,而
映射
temp
则不会

你可以用

Map<String, Map<String, String>> test = new HashMap<String, Map<String, String>>();
            ^                                               ^
            |-----changed LHS type--- must be matched with -|                                               
Map test=newhashmap();
^                                               ^
|-----更改的LHS类型---必须与-|匹配
有界通配符语法
Map
表示
Map
使用扩展
Map
的某种未知类型的值。编译器阻止添加除
null
以外的所有值


注意,右侧值也有<代码> map < /C> >类型,而不是<代码> HashMap <代码>,因为泛型不是协变的,这意味着右侧的泛型类型必须与左侧声明的值完全匹配。

< P>如果使用java SE 7,请考虑菱形运算符:

Map<String, Map<String, String>> test = new HashMap<>();
Map test=newhashmap();

<代码> > p>如果使用java SE 7,请考虑菱形运算符:

Map<String, Map<String, String>> test = new HashMap<>();
Map test=newhashmap();

我拿出了
?扩展
并将内部的
哈希映射
更改为
映射
,我得到了相同的错误。你看到我也更改了作业吗?在编辑问题之前,我第二次发布了我的评论。我正在使用一种方法获取整个地图,但我错过了一个
?扩展
。我读了,但我仍然不明白为什么有界通配符阻止添加非null元素。Java的类型具体化在运行时不存在。泛型仅在编译时强制执行。通配符不能在运行时强制执行,因此编译器会将其踢出。啊,对了,我刚刚从中阅读了有关类型擦除的内容。假设,如果这可以编译,那么在运行时,我的映射将如下所示:
Map test=newhashmap()
,对吗?我拿出了
?扩展
并将内部的
哈希映射
更改为
映射
,我得到了相同的错误。你看到我也更改了作业吗?在编辑问题之前,我第二次发布了我的评论。我正在使用一种方法获取整个地图,但我错过了一个
?扩展
。我读了,但我仍然不明白为什么有界通配符阻止添加非null元素。Java的类型具体化在运行时不存在。泛型仅在编译时强制执行。通配符不能在运行时强制执行,因此编译器会将其踢出。啊,对了,我刚刚从中阅读了有关类型擦除的内容。假设,如果可以编译,那么在运行时,我的映射将如下所示:
Map test=newhashmap()
,对吗?