«Соответствие шаблону» не работает для предложения Int (branch)

У меня есть этот кусок кода в Котлине (который я начал изучать):

package io.shido.learning import java.time.Instant fun typeCheck(any: Any): Any = when (any) { (any is Int && any < 10) -> "(small) integer" is Int -> "integer" is Double -> "double" is String -> "string" else -> "another Any" } fun main(args: Array<String>) { println("type check for: 5 (${typeCheck(5)})") println("type check for: 20 (${typeCheck(20)})") println("type check for: 56.0 (${typeCheck(56.0)})") println("type check for: \"a string\" (${typeCheck("a string")})") println("type check for: Instant (${typeCheck(Instant.now())})") } 

… так что я ожидал, что typeCheck(5) возвратил (small) integer а не integer как в настоящее время.

У кого-нибудь есть идеи? Первая ветвь действительно true для 5 .

введите описание изображения здесь

Когда вы передаете аргумент, when проверяется, соответствует ли аргумент значениям в ветвях, а 5 не соответствует вычисленному true в первой ветви. Таким образом, вы можете исправить свой код таким образом:

 fun typeCheck(any: Any): Any = when { (any is Int && any < 10) -> "(small) integer" any is Int -> "integer" any is Double -> "double" any is String -> "string" else -> "another Any" } 

или

 fun typeCheck(any: Any): Any = when (any) { in 0..10 -> "(small) integer" is Int -> "integer" is Double -> "double" is String -> "string" else -> "another Any" } 

См. Раздел Выражение