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)
}
}
}