0

我有一个地图扩展方法

def getAs[T : Manifest](key: String): Option[T] =
  m.get(key) collect { 
    case v if manifest[T].erasure.isAssignableFrom(v.getClass) => v.asInstanceOf[T]
  }

如果它是可分配的,它会获取键值并将其转换为所需的类型。现在,如果存储项目是 java.lang.Boolean,并且类型参数是 scala.Boolean,那么这不起作用。我想这对于 Int、Long 等也是一样的。

有什么明显的方法可以解决这个问题吗?

4

1 回答 1

0

这是一个蛮力解决方案

  def getAs[T : Manifest](key:String):Option[T] = m.get(key) collect {
    case v if manifest[T].erasure.isAssignableFrom(v.getClass)    => v.asInstanceOf[T]
    case i:java.lang.Integer if manifest[T] == manifest[Int]      => i.asInstanceOf[T]
    case l:java.lang.Long if manifest[T] == manifest[Long]        => l.asInstanceOf[T]
    case f:java.lang.Float if manifest[T] == manifest[Float]      => f.asInstanceOf[T]
    case d:java.lang.Double if manifest[T] == manifest[Double]    => d.asInstanceOf[T]
    case b:java.lang.Boolean if manifest[T] == manifest[Boolean]  => b.asInstanceOf[T]
  }
于 2013-01-15T14:57:18.570 回答