如何在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()
,对吗?