Java 初始化泛型类

Java 初始化泛型类,java,generics,hashmap,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

我试图定义我的第一个泛型类。我想让它扩展一个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);

    }
}
公共类FormattedMap扩展LinkedHashMap{
私有T_密钥映射密钥;
私有T_值映射值;
公共布尔调试=false;
公共格式化地图(){
超级();
}
public void addMapValue(T_KEY KEY,T_VALUE){
}
public void removeMapValue(T_KEY KEY,T_VALUE){
}
公共无效测试(布尔b){
addMapValue(“first”,新整数(2));//这会触发编译器错误消息
}
公共静态void main(字符串[]args){
FormattedMap fm=new FormattedMap();//这很好
调频测试(真);
}
}

这是因为函数签名不兼容
addMapValue(“第一个”,新整数(2))

这是因为函数签名不兼容
addMapValue(“第一个”,新整数(2))

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

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
    }
}

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

让我们忘掉你的main方法。因此,类的代码是

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
    }
}
请注意,无论如何,扩展LinkedHashMap肯定是个坏主意。类应该具有LinkedHashMap,而不是LinkedHashMap。

test()
函数中,编译器无法确定此特定实例是否为
。因此,编译错误

例如,这将起作用:

public static void main(String [] args) {
    FormattedMap<String, Integer> fm = new FormattedMap<>(); // This is fine
    // fm.test(true);
    fm.addMapValue("first", new Integer(2));
}
关键是,您当前假设泛型类型是
String
一个
Integer
,在一段代码中,它期望这些类型是泛型的。

test()
函数中,编译器无法确定此特定实例是
。因此,编译错误

例如,这将起作用:

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

关键是,您当前假设泛型类型是
String
一个
Integer
,在一段期望这些类型是泛型的代码中。

非常感谢!现在情况清楚多了。当然,现在我可以看到我的test()方法毫无意义。非常感谢!现在情况清楚多了。当然,现在我可以看到我的test()方法没有任何意义。