假设我们有一个名为Contract的Java类型,它代表业务合同。之间 类Contract中的方法标题如下:
public Date finish()
返回一个表示合同完成日期的对象。
public void update(Date d)
更改调用它的对象的状态 表示在参数给出的日期之后适用的合同条款的变化。
public int payment(Date d)
返回截止日期作为参数的付款, 这将始终是一个大于0的整数。
public Set<Contract> subcontracts()
返回一个代表所有的集合 由调用此方法的对象表示的契约的子转换。
其中一个问题是:
写一个实例方法进入类名为maximumPayment的类。当调用代表合同的对象时, 此方法应采用Date参数并返回表示形式 无论哪个分包合约都有最大的付款日期 给出。如果合同没有分包合同,那么对象就是 调用方法应该返回。
我的第一个问题是我无法弄清楚如何使用max value返回Contract对象..如果合同没有转包,则应该返回调用该方法的对象...
这是我到目前为止所拥有的...但它不喜欢我从内部类调用方法支付:
public Contract biggestPayment(Date d)
{
List<Contract> clist = new ArrayList<Contract>(subc);
Collections.sort(clist, new Comparator<Contract>()
{
public int compare(Contract c1, Contract c2)
{
c1.payment(d).compareTo(c2.payment(d));
}
});
.......
}
任何帮助都将不胜感激。
答案 0 :(得分:1)
Date d
参数必须是最终的才能在匿名子类中使用它。
public Contract biggestPayment(final Date d) {
另外,请务必在compare()
上调用Integer
方法,而不是int
s。作为int
原始类型,您无法在其上调用任何方法。你可以将它们包装在Integer
中并调用compare
,或者自己比较int
并根据Comparator#compare()
的合同返回结果。
请记住,在匿名子类中使用外部作用域的局部变量需要变量为final
。原因如下:Why are only final variables accessible in anonymous class?。
该变量将作为对子类的引用有效地传入。
所以,这样做:
final Date d;
new Comparator<Contract>() {
public int compare(Contract c1, Contract c2) {
c1.payment(d).compareTo(c2.payment(d));
}
};
大致相当于
Date d;
new MyComparator(d);
private final class MyComparator implements Comparator<Contract> {
Date dueDate;
public MyComparator(Date aDate) {
this.dueDate = aDate;
}
public int compare(Contract c1, Contract c2) {
c1.payment(dueDate).compareTo(c2.payment(dueDate));
}
}