Ошибка вывода типа, но не может проверить экземпляр стертого типа - PullRequest
1 голос
/ 02 июля 2019

У меня есть некоторая логика, которая запускается, только когда объект, считываемый из FileInputStream, является картой:

  private fun loadEncryptedFile(file: File, password: CharArray) {


        var decrypted: ByteArray? = null
        ObjectInputStream(FileInputStream(file)).use {

            when (val data = it.readObject()) {
                is Map<*, *> -> {

                    if (data.containsKey("iv") && data.containsKey("salt") && data.containsKey("encrypted")) {
                        val iv = data["iv"]
                        val salt = data["salt"]
                        val encrypted = data["encrypted"]
                        if (iv is ByteArray && salt is ByteArray && encrypted is ByteArray) {
                            decrypted = Encryption().decrypt(
                                    hashMapOf("iv" to iv, "salt" to salt, "encrypted" to encrypted), password)
                        }
                    }
                }
            }
        }
}

Каждый экземпляр переменной «data» выдает ошибку «Вывод типа не выполнен, значение параметра K должно быть упомянуто во входных типах» error.

Однако замена групповых символов этими типами приводит к ошибке «Не удается проверить экземпляр стертых типов». Где компилятор хочет, чтобы я сказал ему, какие типы содержатся в Map?

1 Ответ

2 голосов
/ 02 июля 2019

Неловкая ситуация.

Немного экспериментов нашел один подход, который, кажется, работает: приведение карты к определенному типу после проверки is Map<*, *>:

        when (val data = it.readObject()) {
            is Map<*, *> -> {
                val castData = data as Map<Any, Any>
                if (castData.containsKey("iv") && data.containsKey("salt") && castData.containsKey("encrypted")) {
                    val iv = castData["iv"]
                    // ...

Это выдает предупреждение 'Unchecked cast', но это не ошибка (и вы, вероятно, можете ее подавить).

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