【问题标题】:Passing HashMap as parameter into a subclass constructor将 HashMap 作为参数传递给子类构造函数
【发布时间】:2021-01-03 09:46:30
【问题描述】:

当我尝试将 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)。然后我创建一个 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 不能应用于给定类型; 公共 TA_Manager(HashMap TA) { ^ 必需:字符串,字符串,字符串 发现:没有参数

我实际上已经搜索过这个 HashMap 问题,并且我遵循了关于如何将 HashMap 传递给构造函数的解决方案: Pass a HashMap as parameter in Java 以及如何将类作为哈希图值传递的链接: Can HashMap contain custom class for key/value?

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

【问题讨论】:

  • 你需要做两件事之一,在student中创建一个默认的构造函数,或者调用当前的构造函数。你希望 TA.name 是什么?

标签: hashmap


【解决方案1】:

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

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

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

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

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

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

}

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

就我个人而言,我希望助教是一名完整的学生并拥有一个哈希图。

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

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

【讨论】:

  • 非常感谢您指出我的错误并提供建议。我采纳了您的建议,在 TA_Manager 类中添加(调用)一个超级构造函数。现在我的程序可以正常运行了。
  • @ss2 你能“接受”这个答案吗?上/下投票按钮附近应该有一个检查。
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多