我在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]


并且应该是安全的,但是如果不是这样,编译器将无法帮助您发现错误。

07-27 17:38