Переменная Kotlin String в параметре функции auto cast to java.lang.String, почему?

Я только что написал код с Kotlin и получил некоторые проблемы, вот тестовый код:

fun testString(s: Any) { when(s) { Int -> println("Int parameter!") String -> println("String parameter!") //Boolean -> println("Not boolean thing!") //Why Boolean cannot use in when? else -> println("Other object!") } } var ss = "This is actual a Kotlin String!" println(ss.javaClass.simpleName) //out: String testString(ss)//out: Other object! Why not String??? 

Проблема заключается в том, что при просто распечатке переменной он показывает ожидаемый результат: String (Kotlin) , но в функции testString выходной будет всегда java.lang.String , поэтому? Тогда другой меня расстраивает: Boolean не может использовать when ? и почему? Заранее спасибо!

Solutions Collecting From Web of "Переменная Kotlin String в параметре функции auto cast to java.lang.String, почему?"

В инструкции when вам нужно будет проверить, имеет ли параметр тип Int / String / Boolean. Таким образом, возвращаемая стоимость должна быть логической. Таким образом, вместо String вам нужно использовать is String :

 fun testString(s: Any) { when(s) { is Int -> println("Int parameter!") is String -> println("String parameter!") is Boolean -> println("boolean thing!") else -> println("Other object!") } } 

Тогда он также будет работать для булевых.

Вы забыли

Это работает:

 fun testString(s: Any) { when(s) { is Int -> println("Int parameter!") is String -> println("String parameter!") is Boolean -> println("Boolean parameter!") else -> println("Other object!") } } 

Подробнее: Тип чеков и бросок