Автобокс типа Котлин против примитива - PullRequest
0 голосов
/ 10 мая 2018
class Remember private constructor() {

  private var data: ConcurrentMap<String, Any> = ConcurrentHashMap()

  private fun <T> saveValue(key: String, value: T): Remember {
    data[key] = value
    return this
  }

  private fun <T> getValue(key: String, clazz: Class<T>): T? {
    val value = data[key]
    var castedObject: T? = null


    //Failed here
    if (clazz.isInstance(value)) {
        castedObject = clazz.cast(value)
    }

    return castedObject
  }

  fun putInt(key: String, value: Int): Remember {
    return saveValue(key, value)
  }

  fun getInt(key: String, fallback: Int): Int {
    val value = getValue(key, Int::class.java)
    return value ?: fallback
  }

}

Когда I putInt(key, 123), 123 автоматически устанавливается на java.lang.Integer.Когда я получаю значение из Map, как мне сравнить value, набранный Any с Class<T>, в котором T в данном случае равно Int:class.java?В настоящее время clazz.isInstance(value) всегда терпит неудачу.Это работает, если этот класс написан на Java

1 Ответ

0 голосов
/ 12 мая 2018

Я думаю, что это не kotlin, а Java. Карта принимает только тип объекта. Таким образом, примитивный тип будет автоматически помещен в карту. Таким образом, значение, возвращаемое из Map, всегда Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...