如何在密封泛型层次结构中定义对象?
如何在密封泛型层次结构中定义对象? 对象声明不适用于泛型。
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
是一个单例,它不能为类型参数提供一个具体类型而继承一个泛型类。
你只能用某种类型定义一个替换T
的object
:
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
是一个单例。