我看到一种独特的情况,keyset
key
LinkedHashSet
包含不同的数据类型,如下所示
您可以看到key
是String
而keyset
是long
。
以下代码因此失败:
modifiedRowKeys.toArray(new Long[modifiedRowKeys.size()]);
我为ArrayStoreException
值获得String
。
我能够从Angular应用程序复制它,我将Map<Long, Map<String,Object>>
发送到我的Spring服务器,其中包含pic中共享的数据。
修改1 :
请在eclipse中看到以下奇怪的行为:
这可能是我们用于转换对象的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);
}
答案 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
实际上是Set
,toString
使用[]
来显示 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));
,不需要运行时检查(也添加缺少的括号):
template