转换 “Object” 到 “HashMap” 使用 Java

Convert "Object" to "HashMap" in Java

提问人:HuyWallz 提问时间:11/4/2023 最后编辑:Basil BourqueHuyWallz 更新时间:11/5/2023 访问量:53

问:

下面是一个示例:

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>”

Java 对象 哈希图

评论

0赞 Basil Bourque 11/4/2023
在此处发布时,请始终包含您的警告或错误的全文。仅仅说“给我一个警告”是没有帮助的。有时提及 Java 的版本也会有所帮助。
0赞 Sree Kumar 11/4/2023
由于 Java 是一种强类型语言,因此它会尝试在编译时预先检查可能的不兼容强制转换/赋值。这通常也是可取的,这样您就不会在生产部署中遇到问题。但是,对于真正的用例(如框架),还有其他规定,如泛型。如果您能提供用例,它会有所帮助。
0赞 Basil Bourque 11/4/2023
在这里发帖时,请尽可能使用正确的英语、标点符号、大小写等。这个网站更像是维基百科,而不是一个休闲聊天室。这次我帮你清理了一些散文。
0赞 Basil Bourque 11/4/2023
顺便说一句,Java 编译器可以推断赋值右侧的参数化类型。所以:。== new HashMap <>();

答:

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
我会把唯一的变量,而不是整个方法。这样可以使抑制范围尽可能小。@SuppressWarningsc
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);
}