首页 > 解决方案 > 将 HashMap 作为参数传递给子类构造函数

问题描述

当我尝试将 HashMap 传递给构造函数时,我一直在努力找出问题并修复错误。我的情况是:

我有一个学生班:

public class Student {
   String name;
   String major;
   String level;
   
   public Student (String name, String major, String level) {
      this.name = name;
      this.major = major;
      this.level = level;
   }    
}

我有另一个类,称为 TA_Manager,它是 Student 的子类。这个 TA_Manager 类使用 HashMap 从 Student 类中收集学生(TA):

import java.util.HashMap;

public class TA_Manager extends Student {
   HashMap<String, Student> TA;
   
   public TA_Manager(HashMap<String, Student> TA) {
      this.TA = TA;
   }
}

在主课中,我创建了三个学生对象,并将其中两个学生放入 HashMap(他们是助教)。然后我创建一个 TA_Manager 对象并将 HashMap 传递给 TA_Manager 类:

import java.util.HashMap;

public class Test {   
   public static void main(String[] args) {
       Student s1 = new Student("A", "CS", "Junior");
       Student s2 = new Student("B", "IS", "Senior");
       Student s3 = new Student("C", "CE", "Senior");

       HashMap<String, Student> TA = new HashMap<String, Student>();       
       TA.put("TA1", s1);
       TA.put("TA2", s2);

       TA_Manager tamgr = new TA_Manager (TA);
   }
}

当我运行主类时,它返回错误:TA_Manager.java:6: 错误:Student 类中的构造函数 Student 不能应用于给定类型;public TA_Manager(HashMap<String, Student> TA) { ^ required: String,String,String found: no arguments

我实际上已经搜索了这个 HashMap 问题,我遵循了关于如何将 HashMap 传递给构造函数的解决方案: Pass a HashMap as parameter in Java 以及如何将类作为 hashmap 值传递的链接: Can HashMap 包含自定义类键/值?

但我仍然收到错误消息。我不知道如何解决这个错误。任何人都可以对此有所了解。非常感谢。

标签: hashmap

解决方案


错误是因为 java 试图调用 Student 类的无参数构造函数,但你只有一个三参数的公共构造函数。

最简单的解决方案是为您的学生创建一个空的公共构造函数。

public Student(){
    //do nothing and leave values as null.
}

这不是一个非常实用的解决方案。这个问题有点概念性。您的 TA 课程是学生,但您没有给它命名专业或级别。

管理它的下一个方法是使用一些值调用当前构造函数。

public TA_Manager(HashMap<String, Student> TA) {
  super( null, null, null);
  this.TA = TA;

}

现在java知道使用公共构造函数而不是无参数构造函数。我将这些值保留为空,因为我不知道您会有什么默认值。当您在构建过程中不需要包含有用的默认值时,这很实用。

就个人而言,我希望 TA 是一个完整的学生并且有一个 hashmap。

public TA_Manager (String name, String major, String level) {
  super(name, major, level);
  this.TA = new HashMap<>();
}

在这种情况下,您将创建经理,然后添加所有学生。它的优点是您的 TA_Manager 是一个完全成熟的学生。


推荐阅读