如果我什么都没有 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 所有 DataTypesEnum
的 Array<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
。
希望这能回答您的问题!
我有一个逻辑上只能有 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 所有 DataTypesEnum
的 Array<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
。
希望这能回答您的问题!