Intereting Posts
сериализация с помощью gson и back не работает с общими типами Kotlin Аннотация: Тип несоответствия: выведенный тип – java.lang.Class <foo>, но java.lang.Class <out jet.Annotation> ожидалось Spring Security несколько успешных поставщиков аутентификации Ошибка Android Studio XML «Соответствующий обработчик методов не найден» on onClick kotlin: общий для разных типов Bulid JAXB классы в Gradle usin Kotlin что эквивалентно этому java-коду kotlin Объем модификатора внутренней видимости в Котлине Как преобразовать символ в значение ascii на языке kotlin Как проверить метод, когда в kotlin Переустановите 2 POST XML и получите ответ JSON от API. с Котлином Ошибка компиляции Котлина: ни одна из следующих функций не может быть вызвана с предоставленными аргументами Составление навигационных конфигураций с использованием функциональной DSL-функции Kotlin Использование переменной из другого файла Kotlin Функция расширения Android Studio 3.0 kotlin 'Unresolved reference'

Каков правильный синтаксис для переопределения функции члена интерфейса с помощью модификатора видимости?

Ни одна из двух страниц, одна на интерфейсах , ни одна из модификаторов видимости не являются примером синтаксиса, который я им предоставляю, поэтому я спрашиваю.

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

package bookyard.contracts; public interface IAuthenticationManager<T> { fun authenticateUser(userName: String, password : String, appId: String, appSecret : String) : OperationResult<T>; } 

И я пишу реализацию для него, но ни один из трех синтаксисов, приведенных ниже, не работает. Каждый раз компилятор сообщает о следующей ошибке:

  1. «authenticateUser» ничего не отменяет

  2. Класс «DatabaseAuthenticationManager» должен быть объявлен абстрактным или реализовать абстрактный элемент public abstract fun authenticateUser (имя_пользователя: String, пароль: String, appId: String, appSecret: String): OperationResult определен в bookyard.contracts.IAuthenticationManager

 package bookyard.server.util import bookyard.contracts.IAuthenticationManager; public class DatabaseAuthenticationManager : IAuthenticationManager<User> { /* override public fun authenticateUser(userName : String?, password : String?, appId : String?, appSecret : String?) : OperationResult<User> { } public override fun authenticateUser(userName : String?, password : String?, appId : String?, appSecret : String?) : OperationResult<User> { } public fun authenticateUser(userName : String?, password : String?, appId : String?, appSecret : String?) : OperationResult<User> { } */ } 

Solutions Collecting From Web of "Каков правильный синтаксис для переопределения функции члена интерфейса с помощью модификатора видимости?"

Проблема…

Ваша проблема в том, что вы используете нулевую строку при попытке реализовать интерфейс.

Из документации Котлина о нулевой безопасности …

В Kotlin система типов различает ссылки, которые могут содержать нуль (ссылки на NULL) и те, которые не могут (непустые ссылки).

String? (nullable String) и String считаются разными типами Kotlin. Поэтому компилятор считает, что вы не реализовали этот метод.

Ваши варианты …

У вас есть 2 варианта:

  1. Обновите свой интерфейс, чтобы использовать параметры с нулевым значением (добавив ? К концу каждого типа).

  2. Обновите свою реализацию, чтобы использовать параметры, не подлежащие обнулению ( String ).

Я думаю, что вариант 2 немного чист, поскольку он не нарушит никаких других существующих реализаций интерфейса.

Пример (для варианта 2):

Интерфейс остается неизменным.

Вот новая реализация …

 package bookyard.server.util import bookyard.contracts.IAuthenticationManager class DatabaseAuthenticationManager : IAuthenticationManager<User> { override fun authenticateUser(userName : String, password : String, appId : String, appSecret : String) : OperationResult<User> { // Your implementation... } } 

Вы можете видеть, что все, что я сделал, это изменить каждый параметр из String? к String .

Заметки:

  • Классы / поля / интерфейсы являются общедоступными по умолчанию , ключевое слово public не нужно.

  • У Котлина есть вывод с двоеточием, поэтому вам не нужно добавлять полуколоны самостоятельно. Есть редкие случаи, когда вам действительно нужно , но компилятор предупредит вас заранее.

Каждый переопределенный метод должен соответствовать объявленному параметру признака параметра. Другими словами, правильным способом реализации интерфейса было бы:

 class DatabaseAuthenticationManager : IAuthenticationManager<User> { override fun authenticateUser(userName: String, password: String, appId: String, appSecret: String): OperationResult<User> { ... } }