键集和键不同的数据类型

时间:2017-06-07 08:41:27

标签: java arrays collections java-8 linkedhashmap

我看到一种独特的情况,keyset key LinkedHashSet包含不同的数据类型,如下所示

enter image description here

您可以看到keyStringkeysetlong

以下代码因此失败:

modifiedRowKeys.toArray(new Long[modifiedRowKeys.size()]);

我为ArrayStoreException值获得String

我能够从Angular应用程序复制它,我将Map<Long, Map<String,Object>>发送到我的Spring服务器,其中包含pic中共享的数据。

enter image description here

修改1

请在eclipse中看到以下奇怪的行为:

enter image description here

这可能是我们用于转换对象的Jackson Mapper的问题吗?

编辑2

以下代码以ClassCastException

失败
  

无法将字符串强制转换为Long

Set<Long> modifiedRowKeys = modifiedRowMap.keySet();
Long[] periodDateArray = new Long[modifiedRowKeys.size()];

int count = 0;
Iterator<Long> keyIterator = modifiedRowKeys.iterator();
while(keyIterator.hasNext()){
    Long key = keyIterator.next();
    System.out.println("key instanceof Long : " + (key instanceof Long));
    periodDateArray[count++] = Long.valueOf(key);
}

这似乎是非常简单的逻辑!

编辑3:

我已按如下方式重新创建问题:

    public static void main(String[] args) {

        CollectionsToArray collectionsToArray = new CollectionsToArray();

        Map<String, Map<String, Object>> mapOfNumbers = collectionsToArray.prepareStrangeNumbersSetFromMapOfMap();

        Object obj = mapOfNumbers;
        collectionsToArray.convertMapToKeySetToArray(obj);

    }

    private Map<String, Map<String, Object>> prepareStrangeNumbersSetFromMapOfMap() {
        Map<String, Map<String, Object>> longNumberMap = new LinkedHashMap<>();

        Map<String, Object> stringValueMap = new HashMap<>();
        stringValueMap.put("Adams", "Adithya");
        stringValueMap.put("Edge", 80);

        longNumberMap.put("1488376800000", stringValueMap);

        return longNumberMap;
    }

    private void convertMapToKeySetToArray(Object obj) {
        Map<Long, Map<String, Object>> mapOfNumbers = (Map<Long, Map<String, Object>>) obj;
        Set<Long> stringNumbers = mapOfNumbers.keySet();

        convertLongKeySetToArray(stringNumbers);
    }

    private void convertLongKeySetToArray(Set<Long> stringNumbers) {
        Long[] stringNumbersArray = stringNumbers.toArray(new Long[0]);
        Arrays.sort(stringNumbersArray);

        System.out.println(stringNumbersArray);
    }

2 个答案:

答案 0 :(得分:2)

如果我使用Map<Long, String>在“编辑2”中运行代码,则编译并运行正常。所以问题不在于你到目前为止所展示的内容。如上所述,尝试创建一个可以重现问题的[mcve]。

我最好的猜测是你有这样的事情:

Map m = new HashMap (); //raw map received from jackson
m.put("abc", "def"); //it's in fact a Map<String, String>
Map<Long, String> modifiedRowMap = m; //but you cast it to something else

其余代码将编译,但您将在运行时获得异常。

答案 1 :(得分:1)

您感到困惑,key是一个字符串,keySet实际上是SettoString使用[]来显示 Set<String> set = new HashSet<>(); set.add("1"); set.add("2"); System.out.println(set); // [1, 2] 的输出。

String

所以你有SetString(不长)。

这会失败,因为在编译时 已知LongSystem.out.println("key instanceof Long" + (s instanceof Long)); ,不需要运行时检查(也添加缺少的括号):

template