Котлин - когда выражение над типом класса - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь написать обработчик вызова, который использует карту (предоставляется во время выполнения) для реализации геттеров интерфейса.

Это очень грубо работает. Я знаю основные типы, которые могут быть возвращены, поэтому я в порядке с выражением when.

Я не нашел способа избежать использования имени класса в качестве субъекта выражения when; есть ли лучший способ?

class DynamicInvocationHandler<T>(private val delegate: Map<String, Any>, clzz: Class<T>) : InvocationHandler {

    val introspector = Introspector.getBeanInfo(clzz)
    val getters = introspector.propertyDescriptors.map { it.readMethod }

    override fun invoke(proxy: Any, method: Method, args: Array<Any>?): Any? {
        if (method in getters) {
            // get the value from the map
            val representation = delegate[method.name.substring(3).toLowerCase()]
            // TODO need better than name
            when (method.returnType.kotlin.simpleName) {                
                LocalDate::class.simpleName -> {
                    val result = representation as ArrayList<Int>
                    return LocalDate.of(result[0], result[1], result[2])
                }
                // TODO a few other basic types like LocalDateTime
                // primitives come as they are
                else -> return representation
            }
        }
        return null
    }
}

Ответы [ 2 ]

0 голосов
/ 12 января 2019

when выражения поддерживают любой тип (в отличие от Java switch), поэтому вы можете просто использовать сам экземпляр KClass:

when (method.returnType.kotlin) {                
    LocalDate::class -> {
        ...
    }
    ...
}
0 голосов
/ 12 января 2019

Вы можете использовать типы вместо имен классов в операторе when. После того, как тип соответствует, умный бросок Kotlin автоматически бросит его

Пример

val temporal: Any? = LocalDateTime.now()

when (temporal){
    is LocalDate -> println("dayOfMonth: ${temporal.dayOfMonth}")
    is LocalTime -> println("second: ${temporal.second}")
    is LocalDateTime -> println("dayOfMonth: ${temporal.dayOfMonth}, second: ${temporal.second}")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...