扩展LinkedHashMap时出错

时间:2016-07-11 11:08:40

标签: java linkedhashmap

我正在尝试从我的Students课程中扩展LinkedHashMap。通过这个,我想引入地图的所有功能,如Map.put(value)Map.get(key)。我只是在PSVM中创建对象而不是静态引用,但我仍然得到以下错误。有人能指出我在这里犯的错误吗?还有更好的方法来完成任务吗?提前谢谢!

import java.util.LinkedHashMap;

public class Students<Integer,String> extends LinkedHashMap<Integer,String> {

    public static void main(String args[]) {                     // line 5
        Students<Integer,String> students = new Students<>();    // line 6
        students.put(1, "s1");
        students.put(2, "s2");
        students.put(3, "s3");

        System.out.println(students.get(1));
    }

}

错误讯息:

>> javac Students.java 
Students.java:5: error: non-static type variable String cannot be referenced from a static context
        public static void main(String args[]) {
                                ^
Students.java:6: error: non-static type variable Integer cannot be referenced from a static context
                Students<Integer,String> students = new Students<>();
                         ^
Students.java:6: error: non-static type variable String cannot be referenced from a static context
                Students<Integer,String> students = new Students<>();
                                 ^
Students.java:6: error: unexpected type
                Students<Integer,String> students = new Students<>();
                                                                ^
  required: class
  found:    <Integer,String>Students<Integer,String>
  where Integer,String are type-variables:
    Integer extends Object declared in class Students
    String extends Object declared in class Students
4 errors

5 个答案:

答案 0 :(得分:4)

通过

class Student<Integer, String>

您已定义了自己的通用类型IntegerString。这些与类Student的实例相关联,但是您也尝试在main()方法中使用这些新的泛型类型,这是静态而不是实例类,这是不允许的。您打算将其用作java.lang.String

简单的解决方案是

  • 不要定义您自己的通用类型,您不需要。
  • 不要延长LinkedHashMap,而是使用合成,因为这会限制您曝光的方法。

e.g。

public class Students {
    private final Map<Integer, String> map = new LinkedHashMap();

    public void put(int num, String str) { map.put(num, str); }

    public String get(int num) { return map.get(num); }

    public static void main(String args[]) { 
        Students students = new Students(); 
        students.put(1, "s1");
        students.put(2, "s2");
        students.put(3, "s3");

        System.out.println(students.get(1));
    }
}

答案 1 :(得分:1)

删除类声明中的类型变量:

public class Students<Integer,String> extends LinkedHashMap<Integer,String>

应该是

public class Students extends LinkedHashMap<Integer,String>

您实际上声明的类型变量的名称恰好与Java类相同,这意味着您的类型变量优先于类名并隐藏它们;您的类定义目前在语义上与:

相同
public class Students<I, S> extends LinkedHashMap<I, S>

答案 2 :(得分:1)

public class Students<Integer,String> extends LinkedHashMap<Integer,String> 

您声明了名为IntegerString的泛型类型参数,这些参数隐藏了标准Java类名称。

如果您希望Students课程仅支持java.lang.Integer个密钥和java.lang.String值,请使用:

public class Students extends LinkedHashMap<Integer,String> 

但是你会用:

声明并实例化该类
Students students = new Students();

因为它将不再具有泛型类型参数。

如果您希望Students类是通用的,请为类型参数使用更多标准名称(不隐藏标准Java类):

public class Students<K,V> extends LinkedHashMap<K,V> 

答案 3 :(得分:1)

声明

class Students<Integer,String> ...

您没有引用现有的类java.lang.Integerjava.lang.String,但是您为通用的Students类声明了自己的type parameters

由于您的班级已经是LinkedHashMap<Integer,String>,只需删除这些类型参数:

class Students extends LinkedHashMap<Integer,String> ...

作为旁注:为单个大写字母的泛型类型命名自己的类型参数是一个好习惯,这也可以防止这种混淆。示例:class Students<I, S> ...

答案 4 :(得分:1)

public class Students<T,E> extends LinkedHashMap<T,E> {