Kotlin + Rx:需要消费者,找到 KFunction
Kotlin + Rx: required Consumer, found KFunction
我正在使用 Kotlin + Retrofit + Rx。我想将其中一个请求提取到函数中:
fun getDataAsync(onSuccess: Consumer<Data>, onError: Consumer<in Throwable>) {
ApiManager.instance.api
.getData("some", "parameters", "here")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
time = System.currentTimeMillis()
onSuccess.accept(it)
}, onError)
}
fun onButtonClick() {
getDataAsync(this::onSuccess, this::onError)
}
private fun onSuccess(data: Data) {}
private fun onError(throwable: Throwable) {}
我在行 getDataAsync(this::onSuccess, this::onError)
:
中遇到错误
Type mismatch: inferred type is KFunction1<@ParameterName Data, Unit> but Consumer<Data> was expected
Type mismatch: inferred type is KFunction1<@ParameterName Throwable, Unit> but Consumer<in Throwable> was expected
如何解决?
您可以传递一个函数,而不是将消费者作为参数传递
fun getDataAsync(onSuccess: (Data) -> Unit, onError: (Throwable) -> Unit) {
ApiManager.instance.api
.getData("some", "parameters", "here")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
time = System.currentTimeMillis()
onSuccess(it)
}, onError)
}
fun onButtonClick() {
getDataAsync(this::onSuccess, this::onError)
}
private fun onSuccess(data: Data) {}
private fun onError(throwable: Throwable) {}
问题是您的方法 getDataAsync
需要一个类型为 Consumer
的对象作为两个参数,而您提供的是方法引用。请注意,同样的错误发生在 Java.
为了解决它,您可以将 getDataAsync
的两个参数都声明为函数引用,或者创建 Consumer
.
的实现
第一个解决方案
fun getDataAsync(onSuccess: (Data) -> Unit, onError: (Throwable) -> Unit) {
}
fun onButtonClick() {
getDataAsync(::onSuccess, ::onError)
}
private fun onSuccess(data: Data) {
}
private fun onError(throwable: Throwable) {}
第二种解决方案
fun getDataAsync(onSuccess: Consumer<Data>, onError: Consumer<in Throwable>) {
}
fun onButtonClick() {
getDataAsync(Consumer { data ->
// do something
}, Consumer { throwable ->
// do something
})
}
我正在使用 Kotlin + Retrofit + Rx。我想将其中一个请求提取到函数中:
fun getDataAsync(onSuccess: Consumer<Data>, onError: Consumer<in Throwable>) {
ApiManager.instance.api
.getData("some", "parameters", "here")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
time = System.currentTimeMillis()
onSuccess.accept(it)
}, onError)
}
fun onButtonClick() {
getDataAsync(this::onSuccess, this::onError)
}
private fun onSuccess(data: Data) {}
private fun onError(throwable: Throwable) {}
我在行 getDataAsync(this::onSuccess, this::onError)
:
Type mismatch: inferred type is KFunction1<@ParameterName Data, Unit> but Consumer<Data> was expected
Type mismatch: inferred type is KFunction1<@ParameterName Throwable, Unit> but Consumer<in Throwable> was expected
如何解决?
您可以传递一个函数,而不是将消费者作为参数传递
fun getDataAsync(onSuccess: (Data) -> Unit, onError: (Throwable) -> Unit) {
ApiManager.instance.api
.getData("some", "parameters", "here")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
time = System.currentTimeMillis()
onSuccess(it)
}, onError)
}
fun onButtonClick() {
getDataAsync(this::onSuccess, this::onError)
}
private fun onSuccess(data: Data) {}
private fun onError(throwable: Throwable) {}
问题是您的方法 getDataAsync
需要一个类型为 Consumer
的对象作为两个参数,而您提供的是方法引用。请注意,同样的错误发生在 Java.
为了解决它,您可以将 getDataAsync
的两个参数都声明为函数引用,或者创建 Consumer
.
第一个解决方案
fun getDataAsync(onSuccess: (Data) -> Unit, onError: (Throwable) -> Unit) {
}
fun onButtonClick() {
getDataAsync(::onSuccess, ::onError)
}
private fun onSuccess(data: Data) {
}
private fun onError(throwable: Throwable) {}
第二种解决方案
fun getDataAsync(onSuccess: Consumer<Data>, onError: Consumer<in Throwable>) {
}
fun onButtonClick() {
getDataAsync(Consumer { data ->
// do something
}, Consumer { throwable ->
// do something
})
}