我正在编写一个比较器来比较两个员工对象。
在这里,我要根据他们的部门来比较两个雇员对象,分别跟他们的名字和id。
我在这里面临的问题是与原始对象的比较,它们的包装器很简单,但是当我尝试根据他们的部门比较两个雇员时,我得到了以下编译错误:
“员工”类型未定义适用于此的getDept(T)
根据我的理解,甚至部门getDept()也应扩展为
getDept(this)
作为函数调用并提供部门详细信息。
代码如下:
Employee.java
package com.deloitte.javatut.pojo;
public class Employee {
public Employee() {
// TODO Auto-generated constructor stub
}
private String emptName;
private Long empId;
private Department dept;
public String getEmptName() {
return emptName;
}
public void setEmptName(String emptName) {
this.emptName = emptName;
}
public Long getEmpId() {
return empId;
}
public void setEmpId(Long empId) {
this.empId = empId;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
Department.java
package com.deloitte.javatut.pojo;
公共课部门{
public Department() {
// TODO Auto-generated constructor stub
}
private String deptName;
private Long deptId;
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((deptId == null) ? 0 : deptId.hashCode());
result = prime * result + ((deptName == null) ? 0 : deptName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Department other = (Department) obj;
if (deptId == null) {
if (other.deptId != null)
return false;
} else if (!deptId.equals(other.deptId))
return false;
if (deptName == null) {
if (other.deptName != null)
return false;
} else if (!deptName.equals(other.deptName))
return false;
return true;
}
}
比较逻辑:
public static void main(String[] args) {
// TODO Auto-generated method stub
Department dept = new Department();
dept.setDeptId(1L);
dept.setDeptName("IT");
Employee emp = new Employee();
emp.setEmpId(2L);
emp.setEmptName("John Doe");
emp.setDept(dept);
Employee emp2 = new Employee();
emp2.setEmpId(4L);
emp2.setEmptName("John Doe 2");
emp2.setDept(dept);
Function<Employee, Department> deptFunction = Employee::getDept;
Comparator<Employee> empComparator = Comparator.comparing(Employee::getDept)
.thenComparing(Employee::getEmpId).thenComparing(Employee::getEmptName);
}
答案 0 :(得分:4)
Department
没有实现Comparable<Department>
,因此Java认为这不是可比的。
要实现此目的,您可以使Department
实现Comparable<Department>
:
class Department implements Comparable<Department> {
// ...
public int compareTo(Department other) {
// By "compare by department", you probably meant comparing by the department name, right?
// If not, implement your own compareTo
return getName().compareTo(other.getName());
}
}
或者,比较在comparing
中可以比较的东西:
Comparator<Employee> empComparator = Comparator.comparing(x -> x.getDept().getName())
.thenComparing(Employee::getEmpId).thenComparing(Employee::getEmptName);