У меня есть метод, которому я передаю объект. В этом методе я проверяю, что это - тип, и в зависимости от типа я делаю что-то с ним и возвращаю Длинное. Я попробовал во все стороны, я могу думать, чтобы сделать это, и я всегда получаю несколько ошибок компилятора, говоря мне, это ожидает определенный объект, но получает другого. Кто-то может объяснить мне, что я делаю неправильно и веду меня в правильном направлении? Что я попробовал, к настоящему времени ниже:
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")
}
}
Сопоставление с образцом сделало бы его намного лучше.
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
}
Этот код требует использования совпадения:
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
}
Последовал моему собственному совету от мой комментарий к исходному ответу ...
Это может быть начало:
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
}
(Мне нечего отменять, и для краткости я пропустил попытку / уловку)