Generics 在Kotlin中使用约束泛型实现抽象类
关于Kotlin 1.3.61的工作 有此代码:Generics 在Kotlin中使用约束泛型实现抽象类,generics,kotlin,Generics,Kotlin,关于Kotlin 1.3.61的工作 有此代码: abstract class ResourceObserver<T> : Observer<T> where T : Resource<T> { override fun onChanged(t: T) { when (t.status) { Status.LOADING -> { ... } Status.ERROR -> {
abstract class ResourceObserver<T> : Observer<T> where T : Resource<T> {
override fun onChanged(t: T) {
when (t.status) {
Status.LOADING -> { ... }
Status.ERROR -> { ... }
Status.SUCCESS -> { onSuccess(t.data) }
}
}
abstract fun onSuccess(data: T?)
}
并试图实现它
private val foo = object : ResourceObserver<Resource<Bar>> {
override fun onSuccess(data: Bar?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
编译器Android Studio在本例中给出以下错误:
Type argument is not within its bounds.
Expected: Resource<Resource<Bar>>
Found: Resource<Bar>
我的明显错误的代码有什么问题?约束,其中T:Resource确实要求您为T使用的任何类型参数也必须是Resource,T由类型本身替换
根据此约束,将检查为实现T:=Resource提供的类型参数是否为Resource≡ 资源,此检查失败
要使此约束和子类型起作用,Bar必须是Resource的子类型实现
你真的需要成为一个有同样T的病人吗?如果使用T:Resource的上限或添加另一个类型参数(如下所示),它会解决您的问题吗
abstract class ResourceObserver<T, R> : Observer<T> where T : Resource<R> { ... }
其中T:Resource的约束确实要求您为T使用的任何类型参数也必须是Resource,T由类型本身替换
根据此约束,将检查为实现T:=Resource提供的类型参数是否为Resource≡ 资源,此检查失败
要使此约束和子类型起作用,Bar必须是Resource的子类型实现
你真的需要成为一个有同样T的病人吗?如果使用T:Resource的上限或添加另一个类型参数(如下所示),它会解决您的问题吗
abstract class ResourceObserver<T, R> : Observer<T> where T : Resource<R> { ... }
这看起来像是试图使用。为了让它发挥作用,你需要 使酒吧扩大资源 将private val foo=object:ResourceObserver{…}改为 通常,资源本身将用类似的约束声明
class Resource<T : Resource<T>>
因此,如果您忘记执行此操作,1个Bar将无法编译。这看起来像是尝试使用。为了让它发挥作用,你需要 使酒吧扩大资源 将private val foo=object:ResourceObserver{…}改为 通常,资源本身将用类似的约束声明
class Resource<T : Resource<T>>
因此,如果您忘记执行此操作,1个Bar将无法编译。请继续告诉我错误,这次是:类型参数不在其范围内。预期:Resource Found:BarKeep给我错误,这次是:类型参数不在其范围内。应为:找到的资源:Bar