在Scala中将通用类型转换为AnyRef

时间:2017-11-12 18:46:23

标签: java scala

我对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,这就是我收到上述错误消息的原因。

2 个答案:

答案 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]

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