Подскажите базовый принцип интефейса в Kotlin на моём примере

В примере базовый каркас приложения по работе с GPS.

Вопрос по инициализации переменной locListenerInterface в классе GpsClass. Как понять концептуально, что мы присваиваем этой переменной при определении?

private var locListenerInterface: LocListenerInterface = (myContext as LocListenerInterface)

Работает так же

private var locListenerInterface: LocListenerInterface = (myContext as MainActivity)

Как вообще правильно инициализировать эту переменную, для передачи координат в MainActivity с класса GpsClass через интерфейс LocListenerInterface

class MainActivity : AppCompatActivity(), LocListenerInterface {
    private val gps = GpsClass(this)
    override fun onLocationChangedInterface(location: Location) {
        // show updated location
    }
}

interface LocListenerInterface  {
    fun onLocationChangedInterface (location: Location)
}

class GpsClass (private val myContext: Context) {
    private var locListenerInterface: LocListenerInterface = (myContext as LocListenerInterface)
    fun onLocationChanged(location: Location) {
        locListenerInterface.onLocationChangedInterface(location)
    }
}

Ответы (1 шт):

Автор решения: alezhu

locListenerInterface у Вас типа LocListenerInterface. Поэтому присвоить ему нужно объект соответствующего типа. Вернее в данном случае объект реализующий интерфейс LocListenerInterface.

myContext у Вас типа Context. Скорее всего Context не наследует/реализует LocListenerInterface. Поэтому просто присвоить myContext в locListenerInterface Вы не можете. Компилятор выдаст ошибку.

Но Вы, как разработчик, знаете что реально внутри в myContext у Вас будет объект, который реализует/наследует и Context и LocListenerInterface. Поэтому Вы явно пишете компилятору считать myContext реализующим LocListenerInterface через ключевое слово as. Компилятор это компилирует, но также внутри добавляет код который проверяет в рантайме правда ли то, что пришло в myContext, реализует LocListenerInterface и если нет будет ошибка выполнения

И писать нужно именно так как в первом примере кода

Второй пример с MainActivity работает потому, что, по сути, внутри происходит как бы два преобразования - вначале вы явно приводите myContext к типу MainActivity, но компилятор видит что MainActivity реализует LocListenerInterface и неявно приводит еще раз MainActivity уже к LocListenerInterface и все опять компилируется.

→ Ссылка