2010-04-17 16 views
8

Mam metodę, do której przekazuję obiekt. W tej metodzie sprawdzam jego typ i zależy od typu, z którym coś robię i zwracam Long. Próbowałem każdego sposobu, w jaki mogę to zrobić i zawsze otrzymuję kilka błędów kompilatora mówiących mi, że spodziewa się pewnego obiektu, ale dostaje inny. Czy ktoś może mi wyjaśnić, co robię źle i poprowadzić mnie we właściwym kierunku? Co próbowałem dotąd jest poniżej:Jak mogę sprawdzić obiekt, aby zobaczyć jego typ i powrócić odlany obiekt

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")   
      } 
    } 

Odpowiedz

36

Dopasowanie wzorców sprawiłoby, że byłoby o wiele ładniej.

+0

to działało idealnie, z wyjątkiem tego, że w przypadku boolowskim dostałem błąd kompilatora mówiąc, że oczekiwano długiego. Zajmowałem się tym, modyfikując go na 'if (b) 1.longValue else 0.longValue' –

+3

To trochę szalone, nie ma żadnych implicit int do long. ZAWSZE jest to bezpieczne. – davetron5000

+7

@Russ: Lub możesz napisać 'if (b) 1L else 0L'. – missingfaktor

6

Kod ten woła o użyciu mecz:

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 
} 

za moim własna rada od mojego komentarzu do mojego pierwotnego post ...

+0

Oczywiście, problem polega na tym, że najpierw w przypadku Object, zawsze będzie pasować. Powinno być na końcu. –

+0

Nie skompiluje się, ponieważ Boolean nie jest podklasą obiektu. – missingfaktor

+1

@Rahul G: To byłoby nierozpoznane w oryginale, ale manifest w tym przypadku, znak, że za pomocą funkcji Scala pomaga ci wyplątać błędy typu. –

2

to może być początek:

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 
} 

(nie mam coś, aby zastąpić, a pominięte w try/catch dla zwięzłość)

Powiązane problemy