在 Java 中使用 instanceOf 运算符时出错
Error in using instanceOf operator in Java
不确定第 24 行出了什么问题。我试图重写 Object.equals() 方法,但由于该方法采用 Object 类型,我想过滤掉不是实例的输入的员工。这是介绍 java 课程
我遇到了这些错误:
4 errors found:
File: /Users/wesley/Documents/Employee.java [line: 24]
Error: ')' expected
File: /Users/wesley/Documents/Employee.java [line: 24]
Error: variable declaration not allowed here
File: /Users/wesley/Documents/Employee.java [line: 24]
Error: ';' expected
File: /Users/wesley/Documents/Employee.java [line: 30]
Error: 'else' without 'if'
这是代码。
//employee number, name, and salary
public class Employee{
private String name;
private final int ID;
private double salary;
private static int lastID;
public Employee(String name, double salary){
this.name=name;
ID=Employee.lastID+1;
this.salary=salary;
Employee.lastID=Employee.lastID+1;
}
public String getName(){return name;}
public int getID(){ return ID; }
public double getSalary(){ return salary;}
public void setName(String newName){name=newName;}
public void raise(double newSalary){ salary=newSalary;}
@Override
public String toString(){
return "Name: "+ getName() + "\nID: " + getID() + "\nSalary: " + getSalary();
}
@Override
public boolean equals(Object o){
if(o instanceOf Employee){//errors are here!
Employee input=(Employee) o;
if(this.getSalary()==input.getSalary() && this.getName().equals(input.getName())){
return true;
}
}
else{return false;
}//another error here
}
}
懒得修改缩进了。当我在
中粘贴东西时发生了
它是 instanceof
,小写 o
,而不是您现在使用的“instanceOf”。更正此错误后,您可以看到并非该方法的所有分支都有 return
语句 - 如果输入第一个 if
而第二个没有输入,会发生什么情况?
简化布尔条件和冗余 else
语句可以解决这个问题:
@Override
public boolean equals(Object o){
if (o instanceof Employee) { // instanceof instead of instanceOf
Employee input=(Employee) o;
return this.getSalary() == input.getSalary() &&
this.getName().equals(input.getName());
}
return false;
}
有很多地方可以改进。
首先,instanceof关键字是小写的。
其次,如果您覆盖 equals(Object)
,您还必须覆盖 hashCode()
,如 this answer 中所述。这个答案还包含如何实现 equals
和 hashCode
.
的优秀示例
第三,您的实现允许 name
为 null
,在这种情况下 this.getName()
为 null
而您的检查
this.getName().equals(input.getName())
抛出一个 NullPointerException
。我建议您遵循 answer or this tutorial 中更稳健的做法,或者通过在构造函数和 setName
.[=36 中检查它来确保 name
永远不会是 null
=]
其他改进和备注
如果有字段 ID
,我假设它是用来 识别 员工的。在那种情况下,它必须包含在equals
检查中。
如果有“ID”,为什么还要检查 name 和 salary?改变 salary 是否也意味着它变成了不同的 Employee?如果我更正 Employee?
的姓名,则相同
ID
的初始化不是线程安全的,可能导致不同的 Employees 拥有相同的 ID
。考虑做:
import java.util.concurrent.atomic.AtomicInteger;
///
private static AtomicInteger lastID = new AtomicInteger();
然后在构造函数中做
this.ID = lastID.getAndIncrement();
这使得以下行不再需要:
Employee.lastID=Employee.lastID+1;
另一件事是 raise
方法还允许将工资设置为 低于 之前的值。我会检查一下,或者将 raise
重命名为 setSalary
.
考虑到所有这些,它会导致类似的结果:
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
public class Employee {
private static AtomicInteger lastID = new AtomicInteger();
private String name;
private final int ID;
private double salary;
public Employee(String name, double salary) {
this.name = name;
ID = lastID.getAndIncrement();
this.salary = salary;
}
public String getName() { return name; }
public int getID() { return ID; }
public double getSalary() { return salary; }
public void setName(String newName) { name = newName; }
public void setSalary(double newSalary) { salary = newSalary; }
@Override
public String toString() {
return "Name: " + getName() + "\nID: " + getID() + "\nSalary: " + getSalary();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Employee)) return false;
Employee employee = (Employee) o;
return ID == employee.ID;
}
@Override
public int hashCode() {
return Objects.hash(ID);
}
}
不确定第 24 行出了什么问题。我试图重写 Object.equals() 方法,但由于该方法采用 Object 类型,我想过滤掉不是实例的输入的员工。这是介绍 java 课程
我遇到了这些错误:
4 errors found:
File: /Users/wesley/Documents/Employee.java [line: 24]
Error: ')' expected
File: /Users/wesley/Documents/Employee.java [line: 24]
Error: variable declaration not allowed here
File: /Users/wesley/Documents/Employee.java [line: 24]
Error: ';' expected
File: /Users/wesley/Documents/Employee.java [line: 30]
Error: 'else' without 'if'
这是代码。
//employee number, name, and salary
public class Employee{
private String name;
private final int ID;
private double salary;
private static int lastID;
public Employee(String name, double salary){
this.name=name;
ID=Employee.lastID+1;
this.salary=salary;
Employee.lastID=Employee.lastID+1;
}
public String getName(){return name;}
public int getID(){ return ID; }
public double getSalary(){ return salary;}
public void setName(String newName){name=newName;}
public void raise(double newSalary){ salary=newSalary;}
@Override
public String toString(){
return "Name: "+ getName() + "\nID: " + getID() + "\nSalary: " + getSalary();
}
@Override
public boolean equals(Object o){
if(o instanceOf Employee){//errors are here!
Employee input=(Employee) o;
if(this.getSalary()==input.getSalary() && this.getName().equals(input.getName())){
return true;
}
}
else{return false;
}//another error here
}
}
懒得修改缩进了。当我在
中粘贴东西时发生了它是 instanceof
,小写 o
,而不是您现在使用的“instanceOf”。更正此错误后,您可以看到并非该方法的所有分支都有 return
语句 - 如果输入第一个 if
而第二个没有输入,会发生什么情况?
简化布尔条件和冗余 else
语句可以解决这个问题:
@Override
public boolean equals(Object o){
if (o instanceof Employee) { // instanceof instead of instanceOf
Employee input=(Employee) o;
return this.getSalary() == input.getSalary() &&
this.getName().equals(input.getName());
}
return false;
}
有很多地方可以改进。
首先,instanceof关键字是小写的。
其次,如果您覆盖 equals(Object)
,您还必须覆盖 hashCode()
,如 this answer 中所述。这个答案还包含如何实现 equals
和 hashCode
.
第三,您的实现允许 name
为 null
,在这种情况下 this.getName()
为 null
而您的检查
this.getName().equals(input.getName())
抛出一个 NullPointerException
。我建议您遵循 answer or this tutorial 中更稳健的做法,或者通过在构造函数和 setName
.[=36 中检查它来确保 name
永远不会是 null
=]
其他改进和备注
如果有字段 ID
,我假设它是用来 识别 员工的。在那种情况下,它必须包含在equals
检查中。
如果有“ID”,为什么还要检查 name 和 salary?改变 salary 是否也意味着它变成了不同的 Employee?如果我更正 Employee?
的姓名,则相同ID
的初始化不是线程安全的,可能导致不同的 Employees 拥有相同的 ID
。考虑做:
import java.util.concurrent.atomic.AtomicInteger;
///
private static AtomicInteger lastID = new AtomicInteger();
然后在构造函数中做
this.ID = lastID.getAndIncrement();
这使得以下行不再需要:
Employee.lastID=Employee.lastID+1;
另一件事是 raise
方法还允许将工资设置为 低于 之前的值。我会检查一下,或者将 raise
重命名为 setSalary
.
考虑到所有这些,它会导致类似的结果:
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
public class Employee {
private static AtomicInteger lastID = new AtomicInteger();
private String name;
private final int ID;
private double salary;
public Employee(String name, double salary) {
this.name = name;
ID = lastID.getAndIncrement();
this.salary = salary;
}
public String getName() { return name; }
public int getID() { return ID; }
public double getSalary() { return salary; }
public void setName(String newName) { name = newName; }
public void setSalary(double newSalary) { salary = newSalary; }
@Override
public String toString() {
return "Name: " + getName() + "\nID: " + getID() + "\nSalary: " + getSalary();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Employee)) return false;
Employee employee = (Employee) o;
return ID == employee.ID;
}
@Override
public int hashCode() {
return Objects.hash(ID);
}
}