我对scala中的类型安全性有疑问。实际上,在Java中我可以将泛型类型转换为Object。注释@SuppressWarning("unchecked")
完成了这项工作。但是在scala中我很难找到一种方法来做到这一点。我使用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
,这就是我收到上述错误消息的原因。
答案 0 :(得分:1)
您是否正在寻找Scala中的投射?
import java.util.HashMap
import java.util.function.Supplier
class MyClass {
val data: HashMap[String, AnyRef] = new HashMap[String, AnyRef]()
def foo[T <: AnyRef](key: String, value: Supplier[T]): T = synchronized {
data.computeIfAbsent(key, (s: String) => value.get()).asInstanceOf[T]
}
}
答案 1 :(得分:1)
我建议您使用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]
并且它应该是安全的,但如果不是,编译器将无法帮助您发现错误。