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