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
Generics 类型不匹配:推断类型为列表<;有吗?>;但是列表<;什么都没有>;预料之中_Generics_Kotlin - Fatal编程技术网

Generics 类型不匹配:推断类型为列表<;有吗?>;但是列表<;什么都没有>;预料之中

Generics 类型不匹配:推断类型为列表<;有吗?>;但是列表<;什么都没有>;预料之中,generics,kotlin,Generics,Kotlin,我有下面的调用接口,它是不变的,在另一个类中,我想调用它的一个函数,但在这一行currentCall?.refresh(result)中出现以下错误 类型不匹配:推断类型为列表,但应为列表。 计划类型呼叫?限制使用公共抽象趣味刷新(列表:列表):中定义的单位 我知道有了星体投影,它的类型就变得未知了,食用它是不安全的。我不知道改变结构和允许这种操作的最佳方式是什么 在这种情况下你会怎么做?例如,您将如何刷新数据 interface Call<T> { fun provide

我有下面的
调用
接口,它是不变的,在另一个类中,我想调用它的一个函数,但在这一行
currentCall?.refresh(result)
中出现以下错误

类型不匹配:推断类型为列表,但应为列表。
计划类型呼叫?限制使用公共抽象趣味刷新(列表:列表):中定义的单位
我知道有了星体投影,它的类型就变得未知了,食用它是不安全的。我不知道改变结构和允许这种操作的最佳方式是什么

在这种情况下你会怎么做?例如,您将如何刷新数据

interface Call<T> {
    fun provider(): Provider<T>
    fun items(): List<T>
    fun refresh(list: List<T>)
}

interface Provider<T> {
    fun enqueue(result: (List<T>) -> Unit)
}

class Main {

    private var currentCall: Call<*>? = null

    fun <T> add(provider: Provider<T>){}

    fun onStart() {
        currentCall?.provider()?.enqueue { result ->
            currentCall?.refresh(result)
        }
    }
}
接口调用{
乐趣提供者():提供者
趣味项目():列表
趣味刷新(列表:列表)
}
接口提供者{
乐趣排队(结果:(列表)->单位)
}
班长{
私有变量currentCall:Call?=null
趣味添加(提供者:提供者){}
有趣的开始(){
currentCall?.provider()?.enqueue{result->
currentCall?刷新(结果)
}
}
}

您有一些我不太明白的地方(可能是错误)。目前,您拥有类型为
Call
currentCall
和一个通用的
add
方法是没有意义的,因为您无法设置
currentCall
提供者

当您将
Main
设置为通用时,此问题也可以解决:

class Main<T> {
最后,您可以将
currentCall
的星形投影替换为
generic
类型参数
T

private var currentCall: Call<T>? = null
private var currentCall:Call?=无效的
这就给你留下了一个类似于:

class Main<T> {

    private var currentCall: Call<T>? = null

    fun add(provider: Provider<T>){}

    fun onStart() {
        currentCall?.provider()?.enqueue { result ->
            currentCall?.refresh(result)
        }
    }
}
主类{
私有变量currentCall:Call?=null
趣味添加(提供者:提供者){}
有趣的开始(){
currentCall?.provider()?.enqueue{result->
currentCall?刷新(结果)
}
}
}

这是可行的,因为您明确地告诉编译器,您在
Main
中使用的每种类型都必须与
T

有某种关联,我可以间接地设置和使用它。我不能有一个通用的Main,这将阻止使用多个不同类型的提供程序。
private var currentCall: Call<T>? = null
class Main<T> {

    private var currentCall: Call<T>? = null

    fun add(provider: Provider<T>){}

    fun onStart() {
        currentCall?.provider()?.enqueue { result ->
            currentCall?.refresh(result)
        }
    }
}