Intereting Posts
Аннотации в Котлине не работают Словарь обфускации Proguard для kotlin Получение класса не найдено Исключение при использовании KotlinJsonAdapterFactory () в Moshi 1.5 с Kotlin Kotlin: Как я могу избежать дублирования кода в конструкторах? Как высмеять функцию верхнего уровня в котлине с помощью jmockit Как получить делегированный экземпляр в Котлин? В чем разница между фигурными фигурными скобками и нормальными скобками в RxJava с Kotlin Ошибка преобразования Java-компонента с наследованием в Kotlin yield бросает исключение KotlinNullPointerException в buildSequence для проектов maven В Kotlin, как мне расширить класс, который имеет несколько конструкторов? Как определить функцию oneline, вызывающую функцию с нулевыми переменными Как получить данные из базы данных Firebase с помощью Kotlin? Каков правильный способ создания нового экземпляра родового класса в котлин? Живой шаблон не работает в Котлине Kotlin: для диапазона циклов должен быть метод 'iterator ()

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

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

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

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> { ... } }