我包装了一条消息并想记录我包装的消息。

val any :Any = msg.wrappedMsg
var result :Class[_] = null

我能找到的唯一解决方案是匹配所有内容:
result = any match {
  case x:AnyRef => x.getClass
  case _:Double => classOf[Double]
  case _:Float  => classOf[Float]
  case _:Long   => classOf[Long]
  case _:Int    => classOf[Int]
  case _:Short  => classOf[Short]
  case _:Byte   => classOf[Byte]
  case _:Unit   => classOf[Unit]
  case _:Boolean=> classOf[Boolean]
  case _:Char   => classOf[Char]
}

我想知道是否有更好的解决方案?
以下两种方法不起作用:(
result = any.getClass //error
// type mismatch;  found   : Any  required: ?{val getClass: ?}
// Note: Any is not implicitly converted to AnyRef.
// You can safely pattern match x: AnyRef or cast x.asInstanceOf[AnyRef] to do so.
result = any match {
  case x:AnyRef => x.getClass
  case x:AnyVal => /*voodoo to get class*/ null // error
}
//type AnyVal cannot be used in a type pattern or isInstanceOf

最佳答案

您可以安全地对任何 Scala 值调用 .asInstanceOf[AnyRef],这将装箱原语:

scala> val as = Seq("a", 1, 1.5, (), false)
as: Seq[Any] = List(, 1, 1.5, (), false)

scala> as map (_.asInstanceOf[AnyRef])
res4: Seq[AnyRef] = List(a, 1, 1.5, (), false)

从那里,您可以调用 getClass
scala> as map (_.asInstanceOf[AnyRef].getClass)
res5: Seq[java.lang.Class[_]] = List(class java.lang.String, class java.lang.Int
eger, class java.lang.Double, class scala.runtime.BoxedUnit, class java.lang.Boo
lean)

用 2.8.0.RC6 测试过,我不知道它在 2.7.7 中有效。

2.8 中绝对新增的是从 AnyVal 派生的类的伴随对象。它们包含方便的 boxunbox 方法:
scala> Int.box(1)
res6: java.lang.Integer = 1

scala> Int.unbox(res6)
res7: Int = 1

关于class - 如何获得 _ :Any 的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3139854/

10-15 08:39