我有一些逻辑仅在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中包含什么类型?
答案 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"]
// ...
这会发出“未经检查的演员表”警告,但这不是错误(您可能可以取消它)。