类型不匹配:推断类型为 Unit 但预期为 Boolean

Posted

技术标签:

【中文标题】类型不匹配:推断类型为 Unit 但预期为 Boolean【英文标题】:Type mismatch: inferred type is Unit but Boolean was expected 【发布时间】:2019-11-19 01:51:49 【问题描述】:

我的手势错误,这是我的代码错误,startActivity(intent)Toast.makeText 中的错误

R.id.menu_share -> 
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://web.whatsapp.com"))
    startActivity(intent)

R.id.menu_info -> 
    Toast.makeText(this,"Ada Toast", Toast.LENGTH_LONG).show()

else -> false

【问题讨论】:

startActivity(intent)Toast.makeText(this,"Ada Toast", Toast.LENGTH_LONG).show() 都返回 Unit 类型,而在您的 else 语句中,您返回的是 false,即 Boolean。您是否在 else 语句中使用 Boolean 值?您可能应该考虑将其删除。 【参考方案1】:

我们需要更多代码才能给你一个完整的答案,但我可以尝试假设并给你最接近的答案。

when有两种使用方式

    独立 作为表达式

如果您将其用作switch,即根据具体情况执行不同的操作 您不需要返回值,也不需要else 语句

例如:

when (menuItem.id)  /** I guess you're trying to perform differet actions based on menu item click */
    R.id.menu_share -> 
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://web.whatsapp.com"))
        startActivity(intent)
     /** returns Unit */

    R.id.menu_info -> 
        Toast.makeText(this,"Ada Toast", Toast.LENGTH_LONG).show()
     /** returns Unit */

 /** result ignores / Unit */

您使用when 的另一种方式是作为表达式,此时您希望语句返回一个值。

在这种情况下,您必须为您提供的类型填写所有可能的情况,如果类型是您无法验证所有其他选项的类型,则必须填写 else,例如 IntString

例如:

val result = when (menuItem.id)  /** I guess you're trying to perform different actions based on menu item click */
    R.id.menu_share -> 
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://web.whatsapp.com"))
        startActivity(intent)
     /** Type mismatch: inferred type is Unit but Boolean was expected */

    R.id.menu_info -> 
        Toast.makeText(this,"Ada Toast", Toast.LENGTH_LONG).show()
     /** Type mismatch: inferred type is Unit but Boolean was expected */

    else -> false /** returns Boolean */

 /** Type mismatch: inferred type is Unit but Boolean was expected */

要解决此问题,您需要在所有情况下都返回相同的类型

val result = when (menuItem.id)  /** I guess you're trying to perform different actions based on menu item click */
    R.id.menu_share -> 
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://web.whatsapp.com"))
        startActivity(intent)
        true
     /** returns Boolean */

    R.id.menu_info -> 
        Toast.makeText(this,"Ada Toast", Toast.LENGTH_LONG).show()
        true
     /** returns Boolean */

    else -> false /** returns Boolean */

 /** returns Boolean */

希望我的解释能回答你的问题,如果没有,欢迎你发表评论。

【讨论】:

【参考方案2】:
R.id.menu_share -> 
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://web.whatsapp.com"))
    startActivity(intent)

R.id.menu_info -> 
    Toast.makeText(this,"Ada Toast", Toast.LENGTH_LONG).show()

else -> 
    // you can either left this block empty or just put `return`

【讨论】:

以上是关于类型不匹配:推断类型为 Unit 但预期为 Boolean的主要内容,如果未能解决你的问题,请参考以下文章

获取类型不匹配:推断类型为 List 但应为 Collection

Kotlin:类型不匹配:推断类型是 Intent?但意图是预期的

Kotlin 类型不匹配:推断类型是 View!但 TextView 是预期的

Kotlin - 类型不匹配:推断类型是 Any?但布尔值是预期的

错误:类型不匹配:推断类型为单位,但应为布尔值

Android Kotlin - viewBinding 类型不匹配:推断类型为 DrawerLayout 但应为 ConstraintLayout