我对scala类型系统有以下问题,我目前不知道如何解决这个问题。
基本上有以下情况:
我有一个班级,我们称之为演员。这个课是模板化的。
class Actor[T](){
def setValue(value: T): Int = {
//do something with value
}
}
另一个类有一个迭代以下类型的HashMap的方法:
var newValues = new HashMap[String, Any]()
此HashMap将包含Int和String类型的值。 HashMap的Key标识一个具体的Actor类,并确保该值的类型适合它引用的模板化Actor类。
另一个类的方法遍历此HashMap:
newValues.foreach(
kv => {
db.getActor(kv._1).setValue(kv._2) //db.getActor returns an Actor identified by kv._1
}
)
因为具体值(kv._2)具有与模板化类在运行时期间收到的数据类型相同的数据类型,我认为scala引擎能够将any类型转换为其具体的子类型T.
但是我在编译期间遇到以下错误:
found : kv._2.type (with underlying type Any)
required: _$3 where type _$3
db.getActor(kv._1).setValue(kv._2)
有人知道解决这个问题吗?我认为通过使用超类型Any可以绕过switch-case并使用对象Any的asInstanceOf [T]。
希望有人可以帮助我!
答案 0 :(得分:2)
这里的问题是:
因为具体值(kv._2)具有 与模板化数据类型相同的数据类型 class已在运行时收到,
说谁?
编译器无法在编译时证明这确实是真的。而且,基本上,它不信任你。
你可以随时使用asIntanceOf
告诉编译器你知道的更好 - 也就是说瞄准你的脚。我想知道db.getActor
返回什么类型!我猜不到存在主义。