如何在密封泛型层次结构中定义对象?

如何在密封泛型层次结构中定义对象? 对象声明不适用于泛型。

sealed class PaginationViewState<T> { object LoadingFirstPage: PaginationViewState<T>()//doesn't work object LoadingPage: PaginationViewState<T>()//doesn't work data class DataLoaded<T>(val data: List<T>): PaginationViewState<T>() data class DataLoadedFromCache<T>(val data: List<T>): PaginationViewState<T>() data class Failure<T>(val e: Throwable): PaginationViewState<T>() } 

你不能这样做,因为一个object是一个单例,它不能为类型参数提供一个具体类型而继承一个泛型类。

你只能用某种类型定义一个替换Tobject

 sealed class PaginationViewState<T> { object LoadingFirstPage: PaginationViewState<Any>() //... } 

如果你想要的是能够使用对象代替PaginationViewState<T>任何可能的 T ,那么你可以使用泛型方差 ,与class PaginationViewState<out T>object ...: PaginationViewState<Nothing>class PaginationViewState<in T>object ...: PaginationViewState<Any> (但是限制T可以出现在类中的位置),或者在你想要使用对象的地方使用星形投影:例如,创建一个函数接受PaginationViewState<*> ,然后可以使用任何T的对象。

LoadingFirstPage本身没有泛型参数, T应该是什么? T没有指定的值。

这就像写作

 sealed class A<T> object O : A<T>() 

T不存在。 另外, object的类型参数是不允许的。

您需要指定一个实际类型而不是泛型类型参数T

 class Foo { // something } sealed class PaginationViewState<T> { object LoadingFirstPage: PaginationViewState<Foo>() object LoadingPage: PaginationViewState<Foo>() data class DataLoaded<T>(val data: List<T>): PaginationViewState<T>() data class DataLoadedFromCache<T>(val data: List<T>): PaginationViewState<T>() data class Failure<T>(val e: Throwable): PaginationViewState<T>() } 

编辑:如marstran说,你可能需要一个class而不是一个object 。 一个object是一个单例。