提问人:HuyWallz 提问时间:11/4/2023 最后编辑:Basil BourqueHuyWallz 更新时间:11/5/2023 访问量:53
转换 “Object” 到 “HashMap” 使用 Java
Convert "Object" to "HashMap" in Java
问:
下面是一个示例:
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> a = new HashMap<Integer, Integer>();
a.put(1,2);
a.put(2,5);
Object b = a;
// Do something here to make the variable "b" become a HashMap
}
}
我试过了这个
HashMap<Integer, Integer> c = (HashMap<Integer, Integer>) b;
我收到以下警告:
未选中强制转换:“java.lang.Object”到“java.util.HashMap<java.lang.Integer,java.lang.Integer>”
答:
1赞
Andrej Istomin
11/4/2023
#1
在这种情况下,警告是可以预料的,因为这样的铸造被认为是不安全的操作。从你的例子中,很难说你为什么需要这样的强制转换,也许你应该重新考虑你的代码以避免它。但是,如果没有其他选项,您可以保留它,因为在运行时它会起作用。还可以考虑禁止显示方法或类的警告:
@SuppressWarnings({"unchecked"})
public static void main(String[] args) {
// your code there
}
评论
1赞
Basil Bourque
11/4/2023
我要加上“可能*不安全”这个词。
0赞
HuyWallz
11/4/2023
我收到了另一个警告:HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized
0赞
Andrej Istomin
11/4/2023
@HuyWallz使用代码示例更新您的问题,或者创建一个不同的问题,因为它与“在 Java 中将”对象“转换为”HashMap“主题无关。
1赞
Rob Spoor
11/4/2023
我会把唯一的变量,而不是整个方法。这样可以使抑制范围尽可能小。@SuppressWarnings
c
1赞
VGR
11/5/2023
#2
不要使用@SuppressWarnings。这个警告的存在是有充分理由的:如果你试图强迫编译器对一个通用类型的对象做出不安全的假设,那么各种奇怪的事情都可能出错。例如:
Map<Integer, Integer> a = Map.of(1, 2, 3, 4);
Object obj = a;
// Compiler warning: unchecked cast
Map<String, String> b = (Map<String, String>) obj;
// Causes ClassCastException, even though the code has no obvious cast!
String key = b.get(1);
执行此操作的安全方法是立即验证对象是否为包含 Integer 键和值的 Map:
Map<Integer, Integer> a = Map.of(1, 2, 3, 4);
Object obj = a;
// This is safe, because it doesn't make any assumptions about generic typing.
Map<?, ?> b = (Map<?, ?>) obj;
Map<Integer, Integer> c = new HashMap<>();
for (Map.Entry<?, ?> entry : b.entrySet()) {
// Throws a ClassCastException right away, instead of later
// in an unexpected and strange place.
Integer key = (Integer) entry.getKey();
Integer value = (Integer) entry.getValue();
c.put(key, value);
}
评论
=
= new HashMap <>();