java - 初始化泛型类

标签 java generics hashmap

我正在尝试定义我的第一个泛型类。我希望它扩展一个 HashMap。 它是一个LinkedHashMap,其中键是泛型类型,值也是泛型类型的ArrayList。

构建此类的实例就可以了。但是,当我想添加值时,编译器会说

incompatible types: String cannot be converted to T_KEY
        addMapValue("first", new Integer(2));
  where T_KEY is a type-variable:
    T_KEY extends Object declared in class FormattedMap

我想这可能是由于我的变量 T_KEY 和 T_VALUE 未初始化? 我如何初始化它们?

这是我的类(class):

public class FormattedMap<T_KEY, T_VALUE> extends LinkedHashMap<T_KEY, ArrayList<T_VALUE>> {

    private T_KEY mapKey;
    private T_VALUE mapValue;
    public boolean DEBUG=false;

    public FormattedMap() {
            super();
    }

    public void addMapValue(T_KEY key, T_VALUE value) {

    }

    public void removeMapValue(T_KEY key, T_VALUE value) {

    }


    public void test(boolean b) {

        addMapValue("first", new Integer(2)); // This triggers the compilor error message

    }

    public static void main(String [] args) {
        FormattedMap<String, Integer> fm = new FormattedMap<>(); // This is fine
        fm.test(true);

    }
}

最佳答案

让我们忘记你的主要方法。该类的代码如下

public class FormattedMap<T_KEY, T_VALUE> extends LinkedHashMap<T_KEY, ArrayList<T_VALUE>> {

    private T_KEY mapKey;
    private T_VALUE mapValue;
    public boolean DEBUG=false;

    public FormattedMap() {
        super();
    }

    public void addMapValue(T_KEY key, T_VALUE value) {
    }

    public void removeMapValue(T_KEY key, T_VALUE value) {
    }

    public void test(boolean b) {
        addMapValue("first", new Integer(2)); // This triggers the compilor error message
    }
}

因此,您的类定义了一个 test() 方法,该方法使用 String 和 Integer 作为参数调用 addMapValue(T_KEY key, T_VALUE value) 方法。鉴于您的类是通用的,通用类型可以是任何类型。不一定是字符串和整数。所以这个方法无法编译通过。

而且,你的类还定义了两个完全没用的字段mapKey和mapValue。

代码应该是:

public class FormattedMap<T_KEY, T_VALUE> extends LinkedHashMap<T_KEY, ArrayList<T_VALUE>> {

    public FormattedMap() {
        super();
    }

    public void addMapValue(T_KEY key, T_VALUE value) {
    }

    public void removeMapValue(T_KEY key, T_VALUE value) {
    }

    public static void main(String [] args) {
        FormattedMap<String, Integer> fm = new FormattedMap<>(); // This is fine
        fm.addMapValue("first", new Integer(2));
        // this is valid, because fm is of type FormattedMap<String, Integer>
    }
}

请注意,扩展 LinkedHashMap 无论如何肯定是一个坏主意。你的类应该有一个 LinkedHashMap,而不是一个 LinkedHashMap。

关于java - 初始化泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24911179/

相关文章:

java - 将正确的 xml 转换为不正确的 xml

java - 输入文本时android EditText滞后

java - 深度优先搜索错误

c# - 转换为具有动态类型参数的通用接口(interface)

javascript - 为什么 HashMap get/set 被认为具有 O(1) 复杂度?

jsp - 如何使用strut标签在JSP中迭代hashmap

java - 为什么 Scala 从对象的 main 方法而不是类的静态 main 方法开始?

java - 为什么我要使用 java.lang.Class.cast

c# - 隐式定义的泛型类型,这可能吗?

java - 在 Java HashSet 中,它如何计算自定义对象的 hashCode?