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

问题描述 投票:4回答:2

这个问题与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方法?


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

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

  • 覆盖保存方法
  • 在重写方法中调用父保存方法
generics inheritance interface java-8 default-method
2个回答
3
投票

你定义的默认方法是无助的,因为Spring将开箱即用一个具有相同擦除的方法(参见CrudRepository.save())。

在这里,您不要调用接口的default方法:

JpaRepository.super.save(invoice); 

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

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

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

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

2
投票

在你的情况下,方法save()不是default。从代码中,它定义为:

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

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

或者如果我可以说,你的推断是不正确的,“默认情况下不暗示default。”

© www.soinside.com 2019 - 2024. All rights reserved.