明确调用Java中的默认方法-当实现的接口使用泛型时

时间:2018-09-04 15:49:50

标签: generics inheritance interface java-8 default-method

这个问题与this one相同,但有所不同。

我有一个界面,例如:

@Repository
public interface InvoiceRepository extends JpaRepository<Invoice, String>{

  // some other methods here 

 default Invoice save(Invoice invoice) {

        //I do sth here

        return JpaRepository.super.save(invoice); // wonT work
    }

}

如何调用已实现的JPA接口的save方法?


更新: 确实,我注意到,扩展JPARepository界面中的保存不是默认设置

在这种情况下,实现此目标的最佳方法是什么?

  • 覆盖保存方法

  • 在覆盖的方法中调用父级保存方法

2 个答案:

答案 0 :(得分:3)

您定义的默认方法是无助的,因为Spring会开箱即用地实现具有相同擦除的方法(请参见CrudRepository.save())。

这里您没有调用接口的default方法:

JpaRepository.super.save(invoice); 

您调用save()的抽象CrudRepository方法。
但是它无法编译为abstract
如果JpaRepository超级类定义了默认的save()方法,则可以像在引用的问题中那样工作,但事实并非如此。

  

在这种情况下,实现此目标的最佳方法是什么?

您可以创建一个具有不同名称的default方法,并从中调用save(),该方法将在运行时调用运行时InvoiceRepository实例:

default Invoice saveInvoice(Invoice invoice) {
    // I do sth here
    ...
    return save(invoice); 
}

答案 1 :(得分:2)

对于您而言,方法save()不是 default 。从代码中,其定义为:

<S extends T> S save(S var1); // abstract, public

注意 -值得一提的是,代码属于工件 org.springframework.data:spring-data-jpa:2.0.9.RELEASE

或者,如果我可以说您的推论是不正确的,那么default默认情况下不是隐含的。”