0

假设我们有一个名为 Contract 的 Java 类型,它代表业务合同。类 Contract 中的方法头如下:

public Date finish()

返回一个表示合同完成日期的对象。

public void update(Date d)

更改调用它的对象的状态,以表示在参数给出的日期之后适用的合同条款的更改。

public int payment(Date d)

返回作为其参数给出的日期到期的付款,这将始终是一个大于 0 的整数。

public Set<Contract> subcontracts()

返回一个集合,表示调用此方法的对象所代表的合约的所有子合约。

被问到的问题之一:

在类 Contract 中编写一个实例方法,称为最大支付。当在代表合同的对象上调用时,此方法应采用 Date 参数并返回在给定日期到期的最大付款分包合同的表示。如果合约没有子合约,则应返回调用该方法的对象。

我的第一个问题是我不知道如何返回具有最大值的合同对象..或者如果合同没有子合同,则应该返回调用该方法的对象......

这是我到目前为止所拥有的......但它不喜欢我从内部类调用方法支付:

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));
       }
});


 .......
}

任何帮助,将不胜感激。

4

1 回答 1

1

Date d为了能够在匿名子类中使用它,参数必须是最终的。

public Contract biggestPayment(final Date d) {

还要确保在s 而不是s 上调用该compare()方法。作为原始类型,您不能在其上调用任何方法。您可以将它们包装在s 中并调用,或者自己比较s 并根据s 的合同返回结果。IntegerintintIntegercompareintComparator#compare()

请记住,在匿名子类中使用外部作用域的局部变量需要变量为final. 原因如下:为什么在匿名类中只能访问最终变量?.

该变量将作为对子类的引用有效地传入。

所以,这样做:

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));
    }
}
于 2013-05-16T09:32:12.260 回答