gpt4 book ai didi

java - 如何将具有整数值的条目添加到 Map

转载 作者:行者123 更新时间:2023-12-05 00:51:43 28 4
gpt4 key购买 nike

我必须在下面的 map 中放置一个整数值。

Map<String,?> map
map.put("key",2000);

当我运行上述代码时,我收到以下错误:

incompatible types: java.lang.Integer cannot be converted to capture#1 of ?

最佳答案

您可以将许多内容分配给 Map<String, ?> 类型的变量。 .例如:

Map<String, ?> map;

map = new HashMap<String, Object>(); // works
map = new HashMap<String, String>(); // works
map = new HashMap<String, Number>(); // works
map = new HashMap<String, Integer>(); // works

一切正常。所以,假设 map = new HashMap<String, String>()被分配给它。然后你尝试运行 .put("key", 2000);就可以了。

显然,这没有任何意义。因此,为什么该代码无法编译。

我假设您的眼球和人脑查看了这段代码并确定 map除了 Map<String, Object> 之外,你不可能指向任何其他东西。或 Map<String, Number>Map<String, Integer>甚至是 Map<String, Serializable> - .put("key", 2000) 的类型会是明智的。

但这不是 java 的工作方式。类型的部分意义在于限制自己,让自己以后可以自由分配其他东西。

正是类似于这个:

Object x = "hello";
x.toLowerCase();

以上无法编译:Object类型没有 toLowerCase()方法。是的,是的,我们的眼球和大脑看着这个然后走:这很愚蠢,当然是这样!看,x 显然指向一个字符串!

但在这种情况下,只需.. 写 String x = "hello" .

因此,这同样适用于您的场景。只需写Map<String, Integer>而是。

很遗憾....

有时您有动态代码想要检查事物是什么并采取相应措施。例如:

void foo(Object o) {
if (o instanceof String s) return s.toLowerCase();
throw new SomeException();
}

但是对于泛型你不能这样做——泛型不能是instanceof检查。你不能这样做:IF 对象我的 map变量指向有 Integer作为值类型(或整数的任何父类(super class)型),然后执行 map.put("key", 2000) ,否则不要。

这不是泛型在 java 中的工作方式。根本没有办法做到这一点。

你唯一能做的就是下令。如果它是真的,编写代码可以正常工作,但如果它不是真的,一切都会变得困惑:你可以强制运行 .put("key", 2000)在 map 上,它将把它放在 map 中,如果那是一张声明为的 map ,比如说,Map<String, String> ,那么任何与该 map 交互的代码都将开始抛出 ClassCastExceptions左右,即使他们从来没有投过任何东西。因为你把一个整数塞进了一个字符串映射中。

因此,为什么编译器会在您强制执行此操作时大喊大叫,以及为什么您不应该这样做。泛型的唯一目的是让您的编程生活更轻松,澄清 API 并捕捉错误,而您正在..通过强制它做相反的事情。但是,嘿,如果你真的想这样做(极不可能):

void example(Map<String, ?> map) {
Map forceIt = map; // raw assignment
forceIt.put("key", 2000); // compiles
}

上面的代码可以编译并执行你所要求的 - 但会警告你这是一个非常糟糕的主意。

of (o instanceof String) return ((String) o).toLowerCase();

关于java - 如何将具有整数值的条目添加到 Map<String, ?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71427147/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com