Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 在Kotlin中使用约束泛型实现抽象类_Generics_Kotlin - Fatal编程技术网

Generics 在Kotlin中使用约束泛型实现抽象类

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 -> {

关于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 -> { ... }
            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