Kotlin地图检查演员表以删除未选中的演员

时间:2020-10-12 19:06:12

标签: kotlin generics maps

我不想抑制警告,实际上我想检查演员表并删除不需要的类型(如果发生)。试图找出最佳方法,但所有示例均针对列表,而非地图。许多类都使用此函数,并且可以获得不需要的数据。我只想要可以在此类中从该类内部进行序列化的那些。

class Controller(private val manager: Manager) {
  
    override fun onStatusUpdate(update: Map<String, *>) {
        // This is where I want to check is the value Serializable type
        manager.onStatusUpdate(update as Map<String, Serializable>)
    }
}

class Manager {
    fun onStatusUpdate(dataMap: Map<String, Serializable>) {
        dataMap.doSomething()....
    }
}

2 个答案:

答案 0 :(得分:1)

恐怕这是不可能的。

这是type erasure的结果。由于早在JDK 1.5中将泛型添加到Java的方式,类型参数不包含在已编译的字节码中。这意味着Map<String, Serializable>Map<Int, List<Pair<String, Float>>都将被编译(在插入所有必需的强制类型转换之后)到简单的Map,而没有关于键或值类型的信息。

因此,在运行时,它们是相同的,并且无法区分它们。 (您可以查看内容,并折扣 some 可能的类型;但这通常对您没有帮助,因为Map<Any?, Any?>总是可能的。)

这就是编译器警告您的原因:不仅是您没有检查过类型,还在于您没有检查过类型。

(唯一安全地进行未经检查的强制类型转换的方法是使用某种 other 方式来了解类型:例如,如果您还单独存储了类名或Class对象,那么,总是会有ClassCastException的风险,您最好在某种程度上允许这样做。)

对于您而言,一种解决方法可能是检查地图的内容;如果每个值is Serializable都可以提供所需的行为,而无需检查地图本身的类型。

答案 1 :(得分:1)

manager.onStatusUpdate(update.filterValues { it is Serializable }.mapValues { it.value as Serializable })

filterValues将删除所有不需要的类型的值,mapValues将类型从Map<String, Any?>更改为Map<String, Serializable>,使编译器满意。

相关问题