keyset 和 key 不同的数据类型
keyset and key different data type
我看到一个独特的情况,我的 keyset
和 LinkedHashSet
的 key
包含不同的数据类型,如下所示
如您所见,key
是 String
,keyset
是 long
。
以下代码因此失败:
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
其余代码将编译,但您将在 运行 时遇到异常。
我看到一个独特的情况,我的 keyset
和 LinkedHashSet
的 key
包含不同的数据类型,如下所示
如您所见,key
是 String
,keyset
是 long
。
以下代码因此失败:
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
其余代码将编译,但您将在 运行 时遇到异常。