【问题标题】:Type Inference failed, but cannot check for instance of erased type类型推断失败,但无法检查擦除类型的实例
【发布时间】:2019-07-02 16:51:13
【问题描述】:

我有一些逻辑只在从 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 中包含哪些类型?

【问题讨论】:

    标签: generics kotlin


    【解决方案1】:

    尴尬的情况。

    一些实验发现了一种似乎可行的方法:将地图转换为特定类型is Map&lt;*, *&gt;检查:

            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"]
                        // ...
    

    这会给出一个“未经检查的强制转换”警告,但这不是错误(您可能可以禁止它)。

    【讨论】:

    • 奇数。不过,现在已经足够好了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多