2017-02-15 4 views
0

Я просто написал код с Котлин, и есть некоторые проблемы, вот тестовый код:Kotlin String переменная в параметре функции auto cast to java.lang.String, почему?

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? и почему? Заранее спасибо!

ответ

4

В 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!") 
    } 
} 

Тогда он также будет работать на логическое значение.

+0

Это работает для меня, спасибо большое !!! – SpkingR

2

Вы забыли is

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

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!") 
    } 
} 

Детали: Type Checks and Casts

+0

Спасибо, это пункт, еще раз спасибо. – SpkingR