Generics 在java中显式调用默认方法-当实现的接口使用泛型时

Generics 在java中显式调用默认方法-当实现的接口使用泛型时,generics,inheritance,interface,java-8,default-method,Generics,Inheritance,Interface,Java 8,Default Method,这个问题和一个扭曲的问题是一样的 我有一个界面,例如: @Repository public interface InvoiceRepository extends JpaRepository<Invoice, String>{ // some other methods here default Invoice save(Invoice invoice) { //I do sth here return JpaRepository.s

这个问题和一个扭曲的问题是一样的

我有一个界面,例如:

@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
    }

}
@存储库
公共接口InvoiceRepository扩展了JpaRepository{
//这里还有其他一些方法
默认发票保存(发票){
//我在这里做某事
返回JpaRepository.super.save(发票);//不起作用
}
}
如何调用已实现JPA接口的save方法?


更新: 实际上,我注意到,在扩展的
JPARepository
界面中,save不是默认值

在这种情况下,实现这一目标的最佳方式是什么

  • 覆盖保存方法

  • 调用重写方法中的父save方法


您定义的默认方法是无效的,因为Spring将使用相同的擦除来实现开箱即用的方法(请参见
crudepository.save()

在这里,您不调用接口的
默认
方法:

JpaRepository.super.save(invoice); 
调用
crudepository
的抽象
save()
方法
但是它不能编译,因为它是
抽象的

如果
JpaRepository
super类定义了一个默认的
save()
方法,它可以像引用的问题一样工作,但事实并非如此

在这种情况下,实现这一目标的最佳方式是什么

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

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

在您的情况下,方法
save()
不是
默认值
。根据代码,其定义为:

<S extends T> S save(S var1); // abstract, public
S保存(S var1);//摘要,公开
注意-值得一提的是,代码属于工件
org.springframework.data:spring数据jpa:2.0.9.RELEASE


或者,如果我可以说,您的推断是错误的,“
默认值
不是默认值。”

事实上,我注意到,在JPARepository界面中,save不是默认值