如何检查对象以查看其类型并返回一个已铸造的对象

时间:2010-04-17 17:28:28

标签: scala casting typechecking

我有传递对象的方法。在这个方法中,我检查它的类型,并根据类型我用它做什么并返回一个长。我已经尝试过每一种我能想到的方式来做这件事我总是会遇到几个编译器错误,告诉我它需要一个特定的对象,但却得到另一个。有人可以向我解释我做错了什么并引导我朝着正确的方向前进吗?我到目前为止所尝试的内容如下:

  override def getInteger(obj:Object) = {
    if (obj.isInstanceOf[Object]) null
    else if (obj.isInstanceOf[Number]) 
      (obj:Number).longValue()
    else if (obj.isInstanceOf[Boolean]) 
      if (obj:Boolean) 1 else 0
    else if (obj.isInstanceOf[String]) 
      if ((obj:String).length == 0 | (obj:String) == "null") 
        null
      else
          try {
            Long.parse(obj:String)
          } catch {
            case e: Exception => throw new ValueConverterException("value \"" + obj.toString() + "\" of type " + obj.getClass().getName() + " is not convertible to Long")        
          }
  }

3 个答案:

答案 0 :(得分:36)

模式匹配会使它更好。

def getInteger(obj: Any) = obj match {
  case n: Number => n.longValue
  case b: Boolean => if(b) 1 else 0
  case s: String if s.length != 0 && s != "null" => s.toLong
  case _ => null
}

答案 1 :(得分:6)

此代码呼吁使用匹配:

obj match {
  case n: Number => n.longValue
  case b: Boolean => if (b) 1 else 0
  case s: String => if ((s eq null) || s.length == 0) null else {
            // try ... catch ... etc.
          }
  case o: Object => null
}

从我对原始回复的评论中听取了我自己的建议......

答案 2 :(得分:2)

这可能是一个开始:

def getInteger (o : Any) : Long = o match {
     case (o: Boolean) => if (o) 1 else 0       
     case (l: Long) => l                        
     case (s: String) => java.lang.Long.parseLong (s)   
     case _ => 0L 
}  

(我没有要覆盖的东西,为了简洁而跳过了try / catch)