系统要求我使用布尔类方法比较2个Date对象的年,月和日。我到处搜索,无法获得有关如何执行此操作的更多信息,我一直在Date类而不是Boolean类中使用equals方法。这是我到目前为止的内容,但它给我一个错误消息。
public Boolean equals(Object obj) {
Date otherDate = (Date)obj;
return year == otherDate.year && month == otherDate.month && day otherDate.day;
}
这是错误消息:
'Date'中的'equals(Object)'与'java.lang.Object'中的'equals(Object)'冲突;尝试使用不兼容的返回类型
答案 0 :(得分:0)
也许我们可以尝试其他方法。
第一: compareDates方法通过构造Date来丢弃时间。
public class EqualityDates {
public static void main(String[] args) throws ParseException {
System.out.println(compareDates(10,0,2019).equals(compareDates(1,0,2019)));
}
private static Date compareDates(int day, int month, int year) throws ParseException {
MyDate myDate = new MyDate();
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, day);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.YEAR, year);
myDate.setMyDate(formatter.parse(formatter.format(cal.getTime())));
return myDate.getMyDate();
}
}
然后::类MyDate覆盖Equals和HashCode来比较日期。
class MyDate {
Date myDate;
public Date getMyDate() {
return myDate;
}
public void setMyDate(Date myDate) {
this.myDate = myDate;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
MyDate otherDate = (MyDate) obj;
if (myDate == null) {
if (otherDate.myDate != null) return false;
} else if (!myDate.equals(otherDate.myDate)) return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((myDate == null) ? 0 : myDate.hashCode());
return result;
}
}
这只是一个尝试!
答案 1 :(得分:0)
我不确定它的意义,但除非我被误解,否则它可以满足您的要求:
public class Date {
private int year;
private int month;
private int day;
// Constructor etc.
@Override
public boolean equals(Object obj) {
Date otherDate = (Date) obj;
return Boolean.logicalAnd(year == otherDate.year,
Boolean.logicalAnd(month == otherDate.month, day == otherDate.day));
}
@Override
public int hashCode() {
return Objects.hash(year, month, day);
}
}
我正在使用Boolean
类方法(Boolean
类中的静态方法)logicalAnd
而不是&&
。由于在调用方法之前先评估每个参数,因此不会像&&
那样使评估短路。否则,它将给出相同的结果。由于您有三个子条件,并且该方法仅接受两个参数,因此我需要将一个调用嵌套为第一个调用中的一个参数。
如评论中所述,该方法需要返回原始boolean
(小b
)并应具有@Override
批注。此外,在覆盖equals
时,最好也覆盖hashCode
并确保相等的对象具有相同的哈希码。
对于生产代码,可以使用内置的LocalDate
而不编写自己的Date
类。 LocalDate
已覆盖equals
和hashCode
,因此我们无需担心它们的实现方式。
答案 2 :(得分:-2)
两个日期对象始终可以使用其自己的equals方法进行比较,该方法以毫秒为单位使用getTime()进行比较。
date1.equals(date2);// returns boolean
您不能覆盖布尔类的equals方法,因为此类是最终的,因此不能扩展。