类型推断失败,但无法检查已删除类型的实例

时间:2019-07-02 16:51:13

标签: generics kotlin

我有一些逻辑仅在FileInputStream中读取的对象是Map时运行:

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

每个“数据”变量实例都给我一个“类型推断失败,在输入类型中应提及参数K的值”错误。

但是,用那些类型替换通配符会给我“无法检查已删除类型的实例”错误。编译器要我在哪里告诉它Map中包含什么类型?

1 个答案:

答案 0 :(得分:2)

尴尬的情况。

一些实验发现一种可行的方法:将地图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"]
                    // ...

这会发出“未经检查的演员表”警告,但这不是错误(您可能可以取消它)。