如何使密封类在kotlin中通用?

是否可以使用下面的AsyncResult类来防止在UserDataAppResult和CreateUserResult中重新定义InFlight,Error和InFlight?

//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密封类层次结构并引入新的类型。

Kotlin不可能。 你使用的每个类型都必须有明确声明的类。 即使在超类中声明嵌套类时,编译器也不会隐式创建类。

对于你的问题,我建议你重写代码,把两个基于继承的层次结构合并为两个合并继承和合成中的一个,或者只是以某种方式重构层次结构,例如(我想假设结果的确切实例是不相关的给你的情况下,当它没有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) } }