Intereting Posts
Как скомпилировать и использовать код Kotlin во время выполнения? Как добавить новую конфигурацию с помощью Gradle Script Kotlin? Kotlin – Возможно ли инициализировать объект-компаньон перед блоком init в классе? Ленивая инициализация элемента с нулевым значением Реактор switchifempty не ведет себя так, как ожидалось, в тесте junit Восстановить N-арное дерево из списка Как проверить генераторы для делегированных свойств? Kotlin Multiple Layer it Reference Как создать новый список из пыльника в котлин? Не могли бы вы объяснить этот фрагмент кода с точки зрения кода C #? Kotlin, ориентированный на Java interop: Идиоматический тип для ленивой коллекции? Не удалось выполнить проверку: сбой инструментария из-за «kotlin.UninitializedPropertyAccessException» Какова точка назначения сопутствующего объекта в котлин Как скомпилировать код Kotlin-JS с сопрограммами? Android Retrofit Получить запрос в кодировке

Проблемы, наследующие внутренний класс java

Я создаю андроидские живые обои, используя Kotlin. Для этого требуется класс, который расширяет WallpaperService, который содержит внутренний класс, который расширяет WallpaperService.Engine.

Поэтому я написал это:

import android.service.wallpaper.WallpaperService import android.service.wallpaper.WallpaperService.Engine public class MyWallpaperService : WallpaperService() { override fun onCreateEngine(): Engine = MyEngine() private inner class MyEngine : Engine() { } } 

Проблема в том, что во время компиляции я получаю следующие 2 ошибки:

 Error:java.lang.RuntimeException: Error generating constructors of class MyEngine with kind IMPLEMENTATION Error:java.lang.UnsupportedOperationException: Don't know how to generate outer expression for lazy class MyWallpaperService 

Я не могу понять, почему это происходит, поэтому любая помощь будет очень признательна.

Solutions Collecting From Web of "Проблемы, наследующие внутренний класс java"

См. KT-6727

Вы можете попробовать следующее обходное решение:

 private inner class MyEngine : super.Engine() { } 

Лучшее решение, которое я нашел, – использовать промежуточный Java-класс:

 public class Intermediate extends WallpaperService.Engine { public Intermediate(WatchfaceService outer) { outer.super(); } } 

Тогда внутренний класс в вашем Kotlin WallpaperService должен наследовать Intermediate, передавая внешний класс в качестве параметра.

 public class MyWallpaperService : WallpaperService() { override fun onCreateEngine(): Engine = MyEngine()​ private inner class MyEngine : Intermediate(this) { } }  public class MyWallpaperService : WallpaperService() { override fun onCreateEngine(): Engine = MyEngine()​ private inner class MyEngine : Intermediate(this) { } }