java - keyset 和 key 不同的数据类型

标签 java arrays collections java-8 linkedhashmap

我看到一个独特的情况,我的 keysetkeyLinkedHashSet包含不同的数据类型,如下所示

enter image description here

如您所见,keyStringkeysetlong .

以下代码因此失败:

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

我得到 ArrayStoreException对于 String值(value)观。

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

enter image description here

编辑 1:

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

enter image description here

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

编辑 2:

以下代码失败并返回 ClassCastException

String cannot be cast to 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);
    }

最佳答案

如果我使用 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

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

关于java - keyset 和 key 不同的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44407701/

相关文章:

java - 创建jar文件时出错: NoClassDefFoundError

java - 两个文件与数组的并集

java - 编写一个名为的递归方法,该方法接受一个整数数组并以相反的排序顺序返回该数组

c++ - 为什么创建大于内存的一维数组失败,但创建大于内存的二维数组没有问题?

java - 任何人都可以向我解释这个 Java 问题吗?

C# - 添加新元素时返回索引的集合

Java Slick2d - 如何将鼠标坐标转换为世界坐标

java - 依次赋值true或false

java - 如何知道用户是否已连接到互联网?

java - 在 HashMap 中,如果存在重复值,如何将前一个键分配给下一个键