Intereting Posts
Вторичный конструктор Котлина Как получить Flowable <List <Foo >> из объекта «Bar» с отношениями «один ко многим» «Foo» с использованием realm и Rxjava Издевательское финальное поле с Котлином Методы ведения журнала Anko не могут быть решены Kara Kotlin для Интернета, будущей интеграции Как получить вход от пользователя в Android Studio в числовом значении и преобразовать его в переменную int в kotlin? Цепочка ошибок Завершение после flatMapCompletable Kotlin: получить расширение файла со стандартной функциональностью Вызовите встроенную функцию Kotlin из Java Kotlin apply () расширение lint сообщение в Android Studio 3.0-alpha8 Kotlin – Расширение для финального класса Проверьте, работает ли моя активность в MultiWindowMode или не используется Kotlin Можно ли скрыть переменные от закрытия лямбды? Как использовать ByteArray.getOrElse Должен ли я использовать демо-код ARCore или написать его самостоятельно?

Переменная 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!") } } 

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