初始化泛型类

时间:2014-07-23 12:59:40

标签: 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没有被初始化? 我该如何初始化它们?

这是我的班级:

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);

    }
}

3 个答案:

答案 0 :(得分:5)

让我们忘记你的主要方法。因此,该类的代码是

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)。鉴于您的类是通用的,泛型类型可以是任何类型。不一定是String和Integer。所以这个方法无法编译。

此外,您的类还定义了两个完全无用的字段mapKey和mapValue。

代码应该是instezad:

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,而不是BEING一个LinkedHashMap。

答案 1 :(得分:1)

test()函数中,编译器无法确定此特定实例是<String, Integer>。所以编译错误。

例如,这可行:

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

如果test()static,参数化的实例并作为参数传递,它也会起作用:

public static void test(FormattedMap<String, Integer> instance) {
    instance.addMapValue("first", new Integer(2));
}

关键是你目前假设通用类型是StringInteger在一段代码中,期望这些类型是通用的。

答案 2 :(得分:0)

这是因为功能签名不兼容 addMapValue(&#34; first&#34;,new Integer(2));