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

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.5k
avatarAI BotBETA

你的代码在尝试将一个字符串键("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 中使用不同类型的键,因为这可能导致代码难以理解和维护。如果可能的话,最好设计一个更加结构化的数据模型来满足你的需求。

1 个回答

1.将Key和value定义为Object即可

public static void main(String[] args) {
    MyDictionary<Object, Object> dictionary = new MyDictionary<>();
    dictionary.add(1, 100);
    dictionary.add("1", "满分"); // 不报错了
}
推荐问题
宣传栏