我在scala中有关于类型安全的问题。实际上,在Java中,我可以将通用类型转换为Object。注释@SuppressWarning("unchecked")
完成了这项工作。但是在斯卡拉,我正在努力寻找一种方法来做到这一点。我已经尝试过使用Shapeless
类的Typeable
API,但也无法正常工作。这是我的代码片段:
class MyClass {
val data: HashMap[String, AnyRef] = new HashMap[String, AnyRef]();
def foo[T](key: String, value: Supplier[T]): T = synchronized {
data.computeIfAbsent(key, (s: String) => { value.get() }) //(1)
//(1) --> The compiler says : type mismatch; found : T required: AnyRef Note that T is unbounded, which means AnyRef is not a known parent.
// Such types can participate in value classes, but instances cannot appear in singleton types or in reference comparisons
}
}
这是
data.computeIfAbsent()
签名:data.computeIfAbsent(x: String, y: Function[ _ >: String, _ <: AnyRef]): AnyRef
。我提供给data.computeIfAbsent()
的函数返回通用类型T
。我无法将T
强制转换为AnyRef
,这就是为什么我收到上述错误消息的原因。 最佳答案
我建议通过使用HashMap[String, Any]
避免此特定问题,但是要强制转换为AnyRef
,您只需编写value.get().asInstanceOf[AnyRef]
。当然,
data.computeIfAbsent(key, (s: String) => { value.get().asInstanceOf[AnyRef] })
将返回
AnyRef
,而不是T
。您可以使用以下方法解决此问题data.computeIfAbsent(key, (s: String) => { value.get().asInstanceOf[AnyRef] }).asInstanceOf[T]
并且应该是安全的,但是如果不是这样,编译器将无法帮助您发现错误。