Класс Kotlin не реализует методы интерфейса, но абстрактный класс действительно реализует методы - PullRequest
2 голосов
/ 07 октября 2019

Я использую spring boot версию 2.1.9 с spring-data. Я определил хранилище

interface TokenRepository : CrudRepository<Token, Long> {

    fun findBySubject(subject: String): Token?
}

. Для целей тестирования я создал абстрактную подделку CrudRepository, которая реализует все методы из CrudRepository:

abstract class RepositoryFake<T> : CrudRepository<T, Long> {

    ...

    override fun existsById(id: Long): Boolean {
        ...
    }

    override fun deleteById(id: Long) {
        ...
    }

    override fun findById(id: Long): Optional<T> {
        ...
    }

    ...

}

. когда я создаю реализацию TokenRepository, которая расширяет RepositoryFake

class TokenRepositoryFake : RepositoryFake<Token>(), TokenRepository {

    override fun findBySubject(subject: String): Token? {
        ...
    }
}

, компилятор жалуется, что TokenRepositoryFake не является абстрактным и не реализует методы existsById, deleteByIdи findById, несмотря на то, что эти методы были реализованы в RepositoryFake. Он не жалуется на другие методы, определенные в CrudRepository. Почему компилятор жалуется на отсутствующие методы, а не на все остальные методы?

Пример сообщения об ошибке: Class 'TokenRepositoryFake' is not abstract and does not implement abstract member public abstract fun deleteById(p0: Long): Unit defined in my.repositories.TokenRepository

1 Ответ

0 голосов
/ 07 октября 2019

Я думаю, что нашел проблему. Если я изменю тип RepositoryFake на

abstract class RepositoryFake<T, ID> : CrudRepository<T, ID>

, а затем изменю TokenRepositoryFake на

class HDChainRepositoryFake : RepositoryFake<HDChain, Long>(), HDChainRepository

, все скомпилируется. Я предполагаю, что это как-то связано с тем, как kotlin обрабатывает дженерики, но не знаю точно, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...