keyset 和 key 不同的数据类型

keyset and key different data type

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

如您所见,keyStringkeysetlong

以下代码因此失败:

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

我得到 ArrayStoreException String 个值。

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

编辑 1:

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

这可能是我们用于对象转换的 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);
    }

你混淆了一些东西,key 是一个字符串,但 keySet 实际上是一个 Set,它使用 toString 来显示 [=16= 的输出].

 Set<String> set = new HashSet<>();
 set.add("1");
 set.add("2");
 System.out.println(set); // [1, 2]

所以你有一个 String 和一个 Set(不长)。

这失败了,因为 String 已知 而不是 在编译时是 Long,不需要运行时检查(也添加缺失的括号):

System.out.println("key instanceof Long" + (s instanceof Long));

如果我 运行 您 "Edit 2" 中的代码带有 Map<Long, String>,它可以编译并且 运行 没问题。所以问题不在于你到目前为止所展示的内容。如上所述,尝试创建一个确实重现问题的 [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

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