如果我什么都没有 return i case of else,如何处理详尽的问题?

How to cope with when exhaustive issue if i don't have nothing to return i case of else?

我有一个逻辑上只能有 3 个值的代码。但是 when 赋值是在 Int 变量类型上。如果我没有 RecyclerView.ViewHolder 对象 return 如果 when 表达式中的“案例”都不会发生,我该怎么办(不可能的情况)。 我可以用“丑陋”的解决方案来解决它,如果 'else' so return 其中一个 RecyclerView.ViewHolder 我在现有情况下 returning,但我想知道是否有更优雅的方法来处理这种情况。 我有以下代码:

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return when (viewType)
     {
         DataTypesEnum.COUNTRY_ITEM.ordinal -> CountryDataItem.onCreateViewHolder(parent)
         DataTypesEnum.LEAGUE_ITEM.ordinal -> LeagueDataItem.onCreateViewHolder(parent)
         DataTypesEnum.GAME_ITEM.ordinal ->  GameDataItem.onCreateViewHolder(parent)
     }
}

编译器说:

when' expression must be exhaustive, add necessary 'else' branch

在你的情况下,抛出一个 InvalidArgumentException 是可以的。一个未知的 ViewHolder 类型可以到达这一点,这绝对不应该发生。如果发生这种情况,则说明出现了严重错误,您希望收到相关通知。

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return when (viewType)
     {
         DataTypesEnum.COUNTRY_ITEM.ordinal -> CountryDataItem.onCreateViewHolder(parent)
         DataTypesEnum.LEAGUE_ITEM.ordinal -> LeagueDataItem.onCreateViewHolder(parent)
         DataTypesEnum.GAME_ITEM.ordinal ->  GameDataItem.onCreateViewHolder(parent)
         else -> throw InvalidArgumentException("Invalid ViewHolder Type")
     }
}

如果您想避免该警告,您可以使用 kotlin require operator 并以这种方式排除不允许的值。但是,如果任何不允许的值进入该函数,它也会抛出异常。

[I] want to know if there is more elegant way to deal with this situation.

如果您绝对确定viewType索引将在正确的范围内,您可以从列表中获取enum。然后你只需要打开那个枚举。

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  return when (DataTypesEnum.values()[viewType])
  {
    DataTypesEnum.COUNTRY_ITEM -> CountryDataItem.onCreateViewHolder(parent)
    DataTypesEnum.LEAGUE_ITEM -> LeagueDataItem.onCreateViewHolder(parent)
    DataTypesEnum.GAME_ITEM ->  GameDataItem.onCreateViewHolder(parent)
  }
}

我同意 J. Hegg 的 ,你应该谨慎!


更新 2020-11-23 进一步的上下文:

I'm just very curious how the line (DataTypesEnum.values()[viewType]) makes all the when return statement to be exhaustive and prevent from the compiler to complain on exhaustive issue?

在您的初始示例中,您打开了 Int 类型。

when (viewType) {
  // ...
}

因此,为了让编译器对 viewTypes 满意,您需要覆盖 Int 的所有可能值,或者在 when 中包含一个 else 语句块。

我的建议是在打开之前将 Int 类型映射到相应的 DataTypesEnum。这样,when 块只需要考虑所有 DataTypesEnum 个选项。

DataTypesEnum.values() returns 所有 DataTypesEnumArray<DataTypesEnum> 的顺序与在您的解决方案中使用 #ordinal values 非常相似。

下一步是从数组中获取值,我使用index access operator [ ].

DataTypesEnum.values()[viewType]
// is the same as
DataTypesEnum.values().get(viewType)

这应该可以解决问题![​​=37=]

如果您不确定 viewType 是否会落入正确的范围内,您可能需要检查值 so you don't hit an IndexOutOfBoundsException

希望这能回答您的问题!