Kotlin:功能类型不匹配
Posted
技术标签:
【中文标题】Kotlin:功能类型不匹配【英文标题】:Kotlin: Funtional Type mismatch 【发布时间】:2017-06-25 05:34:40 【问题描述】:编译时出现以下错误:
类型不匹配:推断类型是 (String, Boolean) -> Any but ((String, Boolean) -> Unit)?预计
我的类型声明是
private val ConsisFilter_Click = filterText: String, isStrictSearch: Boolean ->
try
//My Codes
catch (e: Exception)
try
alert.show()
catch (ignored: Exception)
var ConsisFilterClickEvent:((filterText: String, isStrictSearch: Boolean) -> Unit)? = null
像这样赋值
inputDialog!!.ConsisFilterClickEvent = ConsisFilter_Click
我在其他地方遵循相同的模式,但没有收到任何错误。只有这件特别的作品有问题。难道我做错了什么。请帮帮我。
注意:如果我将 ConsisFilter_Click
的所有代码(try catch 块的代码)放入一个单独的函数中,然后简单地从 ConsisFilter_Click
调用该函数,那么一切都很好
谢谢
【问题讨论】:
【参考方案1】:在 Kotlin 中使用 lambda 时,如果推断的返回类型不是 Unit
,the last expression in it is returned。在您的情况下,这是 try-catch 语句,它也适用于 Kotlin 中的 as an expression。
如果您想强制您的 lambda 的返回类型为 Unit
,您可以按照另一个答案中的说明明确写下其类型,或者您可以直接将其分配给 ConsisFilterClickEvent
,而不是将其存储在另一个变量中首先 - 在这两种情况下,编译器都会发现您不想返回最后一个表达式,而只想使用 try-catch 作为语句。
您可以做的另一件事是在 lambda 末尾显式返回 Unit
对象:
private val ConsisFilter_Click = filterText: String, isStrictSearch: Boolean ->
try
...
catch (e: Exception)
...
Unit
【讨论】:
【参考方案2】:您不能将ConsisFilter_Click
分配给变量ConsisFilterClickEvent
,因为它的隐式类型是(String, Boolean) -> Any
而不是(String, Boolean) -> Unit
。由于 catch-block 的返回类型是 Unit
但 try-block 的最后一条语句的返回类型不是 Unit
,这将使如果您不使用显式类型变量,则 lambda 的返回类型为 Any
。
您必须明确定义变量ConsisFilter_Click
的类型,如下所示:
val ConsisFilter_Click: (filterText: String, isStrictSearch: Boolean) -> Unit =
filterText: String, isStrictSearch: Boolean ->
try
//My Codes
catch (e: Exception)
try
alert.show()
catch (ignored: Exception)
【讨论】:
以上是关于Kotlin:功能类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
当我使用 Kotlin 功能类型而不是 Java 功能接口来使用来自 Kafka 的消息时,缓存不起作用