Как я могу Проверить Объект Видеть его Тип и Возврат Литой Объект

У меня есть метод, которому я передаю объект. В этом методе я проверяю, что это - тип, и в зависимости от типа я делаю что-то с ним и возвращаю Длинное. Я попробовал во все стороны, я могу думать, чтобы сделать это, и я всегда получаю несколько ошибок компилятора, говоря мне, это ожидает определенный объект, но получает другого. Кто-то может объяснить мне, что я делаю неправильно и веду меня в правильном направлении? Что я попробовал, к настоящему времени ниже:

  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")        
          }
  }
8
задан Nathan Kleyn 13 April 2013 в 21:01
поделиться

3 ответа

Сопоставление с образцом сделало бы его намного лучше.

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
}
37
ответ дан 5 December 2019 в 04:39
поделиться

Этот код требует использования совпадения:

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
}

Последовал моему собственному совету от мой комментарий к исходному ответу ...

6
ответ дан 5 December 2019 в 04:39
поделиться

Это может быть начало:

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 
}  

(Мне нечего отменять, и для краткости я пропустил попытку / уловку)

2
ответ дан 5 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: