扩展 LinkedHashMap 时出错
Error extending LinkedHashMap
我正在尝试从我的学生 class 扩展 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
删除 class 声明中的类型变量:
public class Students<Integer,String> extends LinkedHashMap<Integer,String>
应该是
public class Students extends LinkedHashMap<Integer,String>
您实际上声明的类型变量的名称恰好与 Java classes 相同,这意味着您的类型变量优先于 class 名称并隐藏它们;您的 class 定义目前在语义上等同于:
public class Students<I, S> extends LinkedHashMap<I, S>
在
public class Students<Integer,String> extends LinkedHashMap<Integer,String>
您正在声明名为 Integer
和 String
的泛型类型参数,它们隐藏了标准 Java class 名称。
如果您希望 Students
class 仅支持 java.lang.Integer
键和 java.lang.String
值,请使用:
public class Students extends LinkedHashMap<Integer,String>
但随后您将使用 :
声明并实例化 class
Students students = new Students();
因为它将不再具有通用类型参数。
如果您希望 Students
class 是通用的,请为类型参数使用更标准的名称(不会隐藏标准 Java classes) :
public class Students<K,V> extends LinkedHashMap<K,V>
随声明
class Students<Integer,String> ...
您没有引用现有的 classes java.lang.Integer
和 java.lang.String
但您声明自己的 type parameters 为通用 Students
class.
因为您的 class 已经是 LinkedHashMap<Integer,String>
只需删除那些类型参数:
class Students extends LinkedHashMap<Integer,String> ...
附带说明:使用单个大写字母为泛型类型命名自己的类型参数是一个好习惯,这也可以防止此类混淆。示例:class Students<I, S> ...
.
通过
class Student<Integer, String>
您已经定义了自己的通用类型 Integer
和 String
。这些与 class Student
的实例相关联,但是您还尝试在 main() 方法中使用这些新的泛型类型,该方法是静态的而不是实例 class 并且这不被允许。您打算用作 java.lang.String
简单的解决方案是
- 不要定义你自己的泛型类型,你不需要。
- 不要扩展
LinkedHashMap
而是使用组合,因为这会限制您公开的方法。
例如
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));
}
}
public class Students<T,E> extends LinkedHashMap<T,E> {
我正在尝试从我的学生 class 扩展 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
删除 class 声明中的类型变量:
public class Students<Integer,String> extends LinkedHashMap<Integer,String>
应该是
public class Students extends LinkedHashMap<Integer,String>
您实际上声明的类型变量的名称恰好与 Java classes 相同,这意味着您的类型变量优先于 class 名称并隐藏它们;您的 class 定义目前在语义上等同于:
public class Students<I, S> extends LinkedHashMap<I, S>
在
public class Students<Integer,String> extends LinkedHashMap<Integer,String>
您正在声明名为 Integer
和 String
的泛型类型参数,它们隐藏了标准 Java class 名称。
如果您希望 Students
class 仅支持 java.lang.Integer
键和 java.lang.String
值,请使用:
public class Students extends LinkedHashMap<Integer,String>
但随后您将使用 :
声明并实例化 classStudents students = new Students();
因为它将不再具有通用类型参数。
如果您希望 Students
class 是通用的,请为类型参数使用更标准的名称(不会隐藏标准 Java classes) :
public class Students<K,V> extends LinkedHashMap<K,V>
随声明
class Students<Integer,String> ...
您没有引用现有的 classes java.lang.Integer
和 java.lang.String
但您声明自己的 type parameters 为通用 Students
class.
因为您的 class 已经是 LinkedHashMap<Integer,String>
只需删除那些类型参数:
class Students extends LinkedHashMap<Integer,String> ...
附带说明:使用单个大写字母为泛型类型命名自己的类型参数是一个好习惯,这也可以防止此类混淆。示例:class Students<I, S> ...
.
通过
class Student<Integer, String>
您已经定义了自己的通用类型 Integer
和 String
。这些与 class Student
的实例相关联,但是您还尝试在 main() 方法中使用这些新的泛型类型,该方法是静态的而不是实例 class 并且这不被允许。您打算用作 java.lang.String
简单的解决方案是
- 不要定义你自己的泛型类型,你不需要。
- 不要扩展
LinkedHashMap
而是使用组合,因为这会限制您公开的方法。
例如
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));
}
}
public class Students<T,E> extends LinkedHashMap<T,E> {