如何在Java中使用三维Liskov Map?

时间:2013-08-08 19:52:57

标签: 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);

但我收到了这个:

方法put(String,capture#1-of?extends Map)在Map&gt;类型中。不适用于参数(String,Map)

Map<String,String>? extends Map<String,String>不相同吗?

2 个答案:

答案 0 :(得分:2)

外部Map test使用上部通配符值来阻止添加值,而Map temp则不会。

您可以使用

Map<String, Map<String, String>> test = new HashMap<String, Map<String, String>>();
            ^                                               ^
            |-----changed LHS type--- must be matched with -|                                               

有界通配符语法Map<String, ? extends Map<String, String>>表示Map使用扩展Map的某种未知类型的值。编译器会阻止添加除null之外的所有值。

另请注意,右侧值具有Map类型而非HashMap,因为泛型不是协变的,这意味着右侧的通用类型指定的值必须与左侧的通用类型完全匹配手边宣言。

答案 1 :(得分:2)

如果您使用的是Java SE 7,请考虑使用菱形运算符:

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