如何通过扫描器输入自定义 Class 值?

How Can I Input A Custom Class Value Via Scanner?

我正在尝试组装一个小型测试应用程序,该应用程序通过扫描仪获取输入并通过散列图和树集将它们放入内存中。

稍后我将搜索、编辑和删除它们(所以基本上是一个 CRUD),它需要 2 class 一名员工 class 和一名公司员工。我正在尝试为员工输入所有信息,包括公司,这是 POJO 中的外国自定义 class 对象。

它不让我class施放它,我该怎么办?

这是 POJO

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;
    private String ssn;
    private Integer salary;
    private String birthDate;
    private String jobTitle;
    @ManyToOne
    private Company companyName;

   public Employee (String fN, String lN, String SSN, Integer sal, String birth, String jobT, Company compName) {       
    lastName = lN;
    firstName = fN;
    SSN = ssn;
    sal = salary;
    birth = birthDate;
    jobT = jobTitle;
    compName = companyName;
}

public String toString()
{
    return "Employee[Last Name= " + lastName + ", First Name= " + firstName + " SSN= " + ssn + ","
            + "Salary= " + salary + ", Birth Date= " + birthDate + ", Job Title= " + jobTitle + ",]" ;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getSsn() {
    return ssn;
}

public void setSsn(String ssn) {
    this.ssn = ssn;
}

public Integer getSalary() {
    return salary;
}

public void setSalary(Integer salary) {
    this.salary = salary;
}

public String getBirthDate() {
    return birthDate;
}

public void setBirthDate(String birthDate) {
    this.birthDate = birthDate;
}

public String getJobTitle() {
    return jobTitle;
}

public void setJobTitle(String jobTitle) {
    this.jobTitle = jobTitle;
}

public Company getCompanyName() {
      return companyName;
 }

public void setCompanyName(Company companyName) {
       this.companyName = companyName;
}
}

这是 class 扫描仪在

中的一部分
        System.out.println("Enter Company Name : ");
          String val7 = input1.nextLine();
          ...             
          Employee newEmp = new Employee(str1,str2, str3,    val4, str5, str6, val7);

如果我传入 str7,显然会产生错误,因为该方法采用 CompanyName。

知道我需要做什么,因为 ClassCast 在这里不起作用。

编辑这里是公司 class public class 公司{ @ID @GeneratedValue(策略=GenerationType.AUTO) 私人长号; 字符串公司名称; 私有字符串描述;

public String getCompanyName() {
    return companyName;
}
public void setCompanyName(String companyName) {
    this.companyName = companyName;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}
}

只有你已经走了一半的路:

  • 您使用扫描仪并询问创建该扫描仪的新实例所需的值class
  • 您验证所有这些值
  • 您使用它们来创建对象

喜欢:

while (something) {
  String newFirstName = scanner.next();
  ...
  int newSalary = scanner.nextInt();
  ...
  Employee newGuy = new Employee(newFirstName, ...

换句话说:Scanner 只知道如何提供那些特定的 "built-in" 类型,例如 String、int、float,...

因此:如果您需要这些类型的集合,您已经收集了它们 "manually"。

对于您的情况:只需先询问 companies。含义:让用户先进入公司;和您的代码创建公司对象。例如,您可以将它们放入 Map<String, Company> 中。现在,在输入员工时,最后要输入公司名称;然后您的代码检索输入名称的公司对象。

您需要创建 Company 实例,不要将其作为字符串传递:

System.out.println("Enter Company Name : ");
String val7 = input1.nextLine();
Company company = new Company();
company.setCompanyName(val7);

并在创建 Employee

时使用 company 而不是 val7
Employee newEmp = new Employee(str1,str2, str3,    val4, str5, str6, company);

ALSO 你的构造函数有逻辑错误,这个

compName = companyName; 

应该反过来……像这样

companyName = compName; 

因为您想将参数中的值分配给成员,