java-在映射中设置多个值

java-在映射中设置多个值,java,collections,hashmap,Java,Collections,Hashmap,我得到了如下场景: Map1 - Map<String, Map<String,List<Vo>>> Map2 - Map<String, Set<String> Map1-Map Map2-Map您想要做的是不可能的,因为Set和Map除了对象之外,不共享任何公共实现或超类。您可以在官方文档中看到: 你可以做一个地图,但我强烈建议你不要这样做。你怎么知道你的物体是地图还是集合?这是不可能做到的 在我看来,最好的解决方案是创

我得到了如下场景:

Map1 - Map<String, Map<String,List<Vo>>>  
Map2 - Map<String, Set<String>  
Map1-Map

Map2-Map您想要做的是不可能的,因为
Set
Map
除了
对象
之外,不共享任何公共实现或超类。您可以在官方文档中看到:

你可以做一个
地图
,但我强烈建议你不要这样做。你怎么知道你的物体是地图还是集合?这是不可能做到的

在我看来,最好的解决方案是创建一个新类来包装两个集合:

public class YourWrapper {
    Map<String, Map<String,List<Vo>>> a; 
    Map<String, Set<String> b;
    // getter setter etc...
}
公共类包装器{
地图a;

Map您想做的事情是不可能的,因为
Set
Map
除了
对象
之外,不共享任何通用实现或超类。您可以在官方文档中看到它:

你可以做一个
映射
,但我强烈建议你不要这样做。你怎么知道你的对象是一个映射还是一个集合?这是不可能的

在我看来,最好的解决方案是创建一个新类来包装两个集合:

public class YourWrapper {
    Map<String, Map<String,List<Vo>>> a; 
    Map<String, Set<String> b;
    // getter setter etc...
}
公共类包装器{
地图a;

Map如果我理解,您希望将相同的键用于各种不同的类型的值

为什么不创建一个新的
本身,该类由映射、集合组成,其实例可以用作值

class MyClass {

     private Map<String, List<Vo>> theMap;
     private Set<String> theSet;
     ...
     ...   // have its own getters and setters

}
class-MyClass{
私人地图专题地图;
私人设置主题集;
...
…//有自己的getter和setter
}
然后你可以像这样定义你的顶级地图

Map<String, MyClass> myMainMap = new HashMap<String, MyClass>();
Map myMainMap=newhashmap();
或者,也可以使用一个元组


您可以进一步检查这一点,看看是如何做到的。

如果我知道您希望将相同的键用于各种不同的类型的值

为什么不创建一个新的
本身,该类由映射、集合组成,其实例可以用作值

class MyClass {

     private Map<String, List<Vo>> theMap;
     private Set<String> theSet;
     ...
     ...   // have its own getters and setters

}
class-MyClass{
私人地图专题地图;
私人设置主题集;
...
…//有自己的getter和setter
}
然后你可以像这样定义你的顶级地图

Map<String, MyClass> myMainMap = new HashMap<String, MyClass>();
Map myMainMap=newhashmap();
或者,也可以使用一个元组


您可以进一步检查这一点,看看这是如何做到的。

您在这里碰到了两个有趣的元素

首先-映射不属于集合。列表和集合确实属于集合,但映射是不同的,尽管它与列表和集合有一些共同点

其次-以您尝试的方式将类型混合到一个commonMap中是可行的,但应该避免,因为这通常不被视为最佳实践。我们正在处理的问题是由类型擦除引起的。。一旦编译器编译代码,它不会传递任何关于M持有的泛型类型的信息ap或Set。实际上,您的
Map
在编译后的代码中变为原始类型
Map
。问题是要回溯原始值。编译器将不允许您检查实例是否为
Map
Set
。 FLOWING代码段将失败:

public static void processElement(Object commonMapObjectEitherMapOrSet) {
    if (commonMapObjectEitherMapOrSet instanceof Map<String, List<Vo>>) {
        //...
    }
}

你在这里触及了两个有趣的元素

首先-映射不属于集合。列表和集合确实属于集合,但映射是不同的,尽管它与列表和集合有一些共同点

其次-以您尝试的方式将类型混合到一个commonMap中是可行的,但应该避免,因为这通常不被视为最佳实践。我们正在处理的问题是由类型擦除引起的。。一旦编译器编译代码,它不会传递任何关于M持有的泛型类型的信息ap或Set。实际上,您的
Map
在编译后的代码中变为原始类型
Map
。问题是要回溯原始值。编译器将不允许您检查实例是否为
Map
Set
。 FLOWING代码段将失败:

public static void processElement(Object commonMapObjectEitherMapOrSet) {
    if (commonMapObjectEitherMapOrSet instanceof Map<String, List<Vo>>) {
        //...
    }
}

我读了几遍“设置相同的具有相同的键引用”,但我无法对其进行分析。因此,您需要根据字符串将字符串映射到Map1或Map2的映射吗?我读了几遍“设置相同的具有相同的键引用”,但我无法对其进行分析。因此,您需要根据字符串将字符串映射到Map1或Map2的映射吗?