I don't quite understand this line:
article.getMoneyBackGuarantee().on(today).claim(this::offerMoneyBack);
in the below code:
public class Demo {
private void offerMoneyBack() {
System.out.println("Offer money back.");
}
private void offerRepair() {
System.out.println("Offer repair.");
}
public void claimWarranty(Article article) {
LocalDate today = LocalDate.now();
article.getMoneyBackGuarantee().on(today).claim(this::offerMoneyBack);
article.getExpressWarranty().on(today).claim(this::offerRepair);
System.out.println("-----------------");
}
public void run() {
LocalDate sellingDate = LocalDate.now().minus(40, ChronoUnit.DAYS);
Warranty moneyBack1 = new TimeLimitedWarranty(sellingDate, Duration.ofDays(60));
Warranty warranty1 = new TimeLimitedWarranty(sellingDate, Duration.ofDays(365));
Article item1 = new Article(moneyBack1, warranty1);
this.claimWarranty(item1);
this.claimWarranty(item1.withVisibleDamage());
this.claimWarranty(item1.notOperational().withVisibleDamage());
this.claimWarranty(item1.notOperational());
Article item2 = new Article(Warranty.VOID, Warranty.lifetime(sellingDate));
this.claimWarranty(item2.withVisibleDamage().notOperational());
}
public interface Warranty {
Warranty on(LocalDate date);
default void claim(Runnable action) { action.run(); }
Warranty VOID = new VoidWarranty();
static Warranty lifetime(LocalDate issuedOn) {
return new LifetimeWarranty(issuedOn);
}
}
The getMoneyBackGuarantee() and on() methods both return a Warranty object, and the implementation of all Warranty objects has the same claim() method. My question is, how does this run? The claim method is expecting a runnable object, but we pass it a method reference instead? (e.g. this::offerMoneyBack)