Как сделать закрытые классы родовыми в котлин?

Можно ли использовать класс AsyncResult ниже для предотвращения переопределения InFlight, Error и InFlight в UserDataAppResult и CreateUserResult?

//TODO: use this to make the below classes generic? sealed class AsyncResult{ object InFlight : AsyncResult() data class Error(val errorMessage: String) : AsyncResult() data class Loaded<out T>(val users: T) : AsyncResult() } sealed class UserDataAppResult : AppResult() { object InFlight : UserDataAppResult() data class Error(val errorMessage: String) : UserDataAppResult() data class Loaded(val users: List<User>) : UserDataAppResult() } sealed class CreateUserResult : AppResult() { object InFlight : CreateUserResult() data class Error(val errorMessage: String) : CreateUserResult() data class Loaded(val users: User) : CreateUserResult() } 

Возможно ли, чтобы приведенный выше код выглядел так?

 sealed class AsyncResult{ class InFlight : AsyncResult() data class Error(val errorMessage: String) : AsyncResult() data class Loaded<out T>(val users: T) : AsyncResult() } sealed class UserDataAppResult : AsyncResult() sealed class CreateUserResult : AppResult() val activeUsers: Flowable<UserDataAppResult> = appDatabase.userDao().getActiveUsers(appSettings.currentLanguage.ordinal) .map<UserDataAppResult> { UserDataAppResult.Loaded(it) } .onErrorReturn { UserDataAppResult.Error(it.localizedMessage) } .startWith(UserDataAppResult.InFlight) .observeOn(AndroidSchedulers.mainThread()) .share() fun createUser(): Flowable<CreateUserResult> { val userId = UUID.randomUUID().toString() val user = User() user.id = userId return appDatabase.userDao().insertAll(user) .map <CreateUserResult> { CreateUserResult.Loaded(user) } .onErrorReturn { CreateUserResult.Error(it.localizedMessage) } .startWith(CreateUserResult.InFlight) } 

В настоящее время UserDataAppResult.Error не найден, что имеет смысл. Но можно ли повторно использовать закрытую иерархию классов AppResult и вводить новые типы.

Это невозможно в Котлине. Каждый тип, который вы используете, должен иметь явно объявленный класс. Классы не создаются неявно компилятором даже в случае, когда вложенные классы объявляются в суперклассе.

Для вашей проблемы я рекомендую вам переписать код из объединения двух основанных на наследовании иерархий в один из двух комбинаций наследования и составления, или просто перестроить иерархию каким-либо образом, например (я полагаю, что точный экземпляр результата будет неактуальным вам в случае, если он не Loaded ):

 sealed class AsyncResult { object InFlight : AsyncResult() data class Error(val errorMessage: String) : AsyncResult() sealed class Loaded<out T>(val result: T) : AsyncResult() { sealed class UserDataAppResult(users: List<User>) : Loaded<List<User>>(users) sealed class CreateUserResult(user: User) : Loaded<User>(user) } }