当前位置: 首页 > 知识库问答 >
问题:

java map 里怎么才能放不同类型的key,比如 put(1, 100),put("1", "满分")?

汝岳
2024-05-04

java map 里怎么才能放不同类型的key,比如 put(1, 100),put("1", "满分")

public class MyDictionary<K, V> implements DictionaryInterface<K, V> {

private Map<K, V> map;public MyDictionary() {    map = new HashMap<>();}public void add(K key, V value) {    map.put(key, value);}public V get(K key) {    return map.get(key);}

}

public class Main {

public static void main(String[] args) {    MyDictionary<Integer, String> dictionary = new MyDictionary<>();    dictionary.add(1, 100);    dictionary.add("1", "满分") // 报错了}

}

共有1个答案

吕森
2024-05-04

你的代码在尝试将一个字符串键("1")放入一个已定义为接收 Integer 类型键的 MyDictionary 对象时,会报错。这是因为 MyDictionary 的类型参数 KV 在实例化时被设定为 IntegerString,所以该字典只能接收 Integer 类型的键和 String 类型的值。

如果你想要在一个字典中存储不同类型的键,你需要使用通配符泛型(Wildcard Generics)。通配符泛型允许你创建更加灵活的代码,可以处理未知类型的对象。在你的情况下,你可以使用 ? 作为键的类型参数,这样你的字典就可以接受任何类型的键了。但是请注意,尽管键的类型变得灵活,但值的类型仍然需要明确指定。

下面是一个修改后的 MyDictionary 类,它可以接受不同类型的键:

public class MyDictionary<V> {    private Map<Object, V> map;    public MyDictionary() {        map = new HashMap<>();    }    public void add(Object key, V value) {        map.put(key, value);    }    public V get(Object key) {        return map.get(key);    }}

然后你可以像这样使用它:

public class Main {    public static void main(String[] args) {        MyDictionary<String> dictionary = new MyDictionary<>();        dictionary.add(1, "100");        dictionary.add("1", "满分");        System.out.println(dictionary.get(1));  // 输出 "100"        System.out.println(dictionary.get("1")); // 输出 "满分"    }}

在这个版本中,MyDictionary 的键被设定为 Object 类型,这意味着它可以接受任何类型的对象作为键。但是,值仍然是特定类型 V,这样你可以保持类型安全。注意,当你从字典中检索值时,你需要将键强制转换为正确的类型,否则可能会遇到 ClassCastException

请注意,尽管上述代码在技术上可以实现你的需求,但在实际编程中,通常不建议在 Map 中使用不同类型的键,因为这可能导致代码难以理解和维护。如果可能的话,最好设计一个更加结构化的数据模型来满足你的需求。

 类似资料:
  • 我在泽西岛有一个Rest服务,我正在使用邮递员实现 我在邮递员中得到以下错误:

  • put

    此方法用于在流程字典中放置key, value对。 语法 (Syntax) put(key,value) 参数 (Parameters) key - 需要添加到流程字典中的密钥。 value - 需要添加到流程字典中的值。 返回值 (Return Value) 没有 例如 (For example) -module(helloworld). -export([start/0]). start

  • put

    此方法用于向地图添加键值对。 语法 (Syntax) put(key1,value1,map1) 参数 (Parameters) key1 - 这是需要添加到地图的密钥。 Value1 - 这是与key1关联的值,需要将其添加到地图中。 map1 - 这是需要添加键值的映射。 返回值 (Return Value) 带有附加键值的原始地图。 例如 (For example) -module(hel

  • 将指定的值与此Map中的指定键相关联。 如果此Map先前包含此键的映射,则旧值将替换为指定的值。 语法 (Syntax) Object put(Object key, Object value) 参数 (Parameters) 键 - 放入地图的关键 值 - 密钥的关联值 返回值 (Return Value) 插入的返回键值对。 例子 (Example) 以下是此方法的使用示例 - class

  • PUT

    HTTP PUT 请求方法创建新的资源或替换请求负载目标资源的表示。 PUT和POST之间的差是,PUT是幂等:调用它一次或多次连续具有相同的效果(也就是没有侧面的效果),在那里连续的相同POST可具有额外的效果,如通过顺序数次。 请求具有正文 是 成功的回应有身体 没有 安全 没有 幂等 是 可缓存 没有 在 HTML 表单中允许 没有 语法 PUT /new.html HTTP/1.1 示例

  • 问题内容: 我讨厌以下模式: 当嵌套图表示多维结构时,此示例仅会刮擦要编写的额外代码的表面。 我确定某个地方可以避免这种情况,但是我在Google搜索中所做的努力没有任何意义。 有什么建议? 问题答案: 的 和从Java 8 有 它返回映射到键的值,或者插入给定的值;如果没有为键映射任何值,则返回null。 如果您需要懒惰的价值评估,