generics - 类型推断失败,但无法检查擦除类型的实例
问题描述
我有一些逻辑仅在从 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 中包含哪些类型?
解决方案
尴尬的局面。
一些实验发现了一种似乎可行的方法:在检查后将地图转换为特定类型: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"]
// ...
这会给出一个“未经检查的演员表”警告,但这不是一个错误(你可能会抑制它)。
推荐阅读
- reactjs - React - 将焦点放在 body 元素/理解 refs
- javascript - jQuery .load() 如何影响具有许多 .load() 的站点;
- statamic - 如何使用 Statamic 表单验证多个复选框?
- razor - 如何判断一个 RenderFragment 是否有内容
- javascript - 未知的正则化器:tensorflowjs 中的 L2
- powershell - ping 计算机并列出登录用户
- r - R 插入 1 个额外的 obs。和 1 个额外的变量。读取 csv 时
- python - 如何使用多线程在 tkinter 应用程序中播放/暂停 BG 音乐?
- sql - 表自连接
- flutter - 打开通知面板时自定义声音停止