Явный вызов метода по умолчанию в Java - когда реализованный интерфейс использует дженерики - PullRequest
0 голосов
/ 04 сентября 2018

Этот вопрос такой же, как этот с изюминкой.

У меня есть такой интерфейс:

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


Обновление: Действительно, я заметил, что сохранение не является расширенным интерфейсом JPARepository

В таком случае, каков наилучший способ достижения этого?

  • метод сохранения с переопределением

  • вызов родительского метода сохранения в переопределенном методе

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

В вашем случае метод save() не является default. Из кода он определяется как:

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

Примечание - Стоит отметить, что код принадлежит артефакту org.springframework.data:spring-data-jpa:2.0.9.RELEASE.

Или, если я могу сказать, ваш вывод неверен, "default не подразумевается по умолчанию."

0 голосов
/ 04 сентября 2018

Метод по умолчанию, который вы определили, беспомощен, поскольку 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); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...