You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Kotlin中没有支持ClosedRange包含判断的in运算符?

问题解答

1. 该情况是Android/Kotlin团队的设计疏漏吗?

不是。Kotlin标准库的ClosedRange定位是通用基础接口,仅要求实现最基础的元素所属判断能力。区间嵌套包含的规则在不同业务场景下存在差异(比如边界是否算包含、离散区间是否要求步长一致等),不属于通用基础能力范畴,因此标准库没有默认实现。

2. 这是否是有意的设计决策?是否存在不符合直觉的行为?

是有意的设计决策。Kotlin的设计原则是避免在通用基础类中预设存在歧义的实现,防止不同业务场景下出现不符合预期的行为。
这个设计确实存在不符合直觉的点:多数开发者会默认认为in关键字天然支持区间嵌套判断,第一次遇到编译报错时容易困惑。

3. 若为有意设计,最优的规避方案是什么?

根据使用场景选择即可:

  • Android开发且已依赖core-ktx:使用toRange()方案即可,注意使用前先校验区间有效性,遇到负区间先调整为正向:
    // 先调整为正向区间再转换
    val validRange = if (b >= a) a..b else b..a
    val targetRange = if (y >= x) x..y else y..x
    val isContained = validRange.toRange() in targetRange.toRange()
    
  • 跨平台/不想依赖AndroidX:自行给ClosedRange扩展符合自身业务逻辑的contains操作符即可:
    // 可根据业务需求调整边界判断逻辑,比如左闭右开场景可修改end的判断规则
    operator fun <T : Comparable<T>> ClosedRange<T>.contains(other: ClosedRange<T>): Boolean {
        return this.start <= other.start && other.endInclusive <= this.endInclusive
    }
    
    扩展完成后直接写a..b in x..y即可正常运行。

内容的提问来源于stack exchange,提问作者m.reiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:15:03