2010-04-17 17 views
8

Ich habe eine Methode, an die ich ein Objekt übergebe. Bei dieser Methode überprüfe ich den Typ und je nach Typ mache ich etwas damit und gebe ein Long zurück. Ich habe alles versucht, was mir dazu einfällt, und ich bekomme immer mehrere Compilerfehler, die mir sagen, dass es ein bestimmtes Objekt erwartet, aber ein anderes bekommt. Kann mir bitte jemand erklären, was ich falsch mache und mich in die richtige Richtung lenken? Was ich habe, ist unten so weit versucht:Wie kann ich überprüfen, ob ein Objekt seinen Typ sieht und ein gegossenes Objekt zurückgibt

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

Antwort

36

Mustervergleich würde es viel schöner machen.

+0

Dies funktionierte perfekt, mit der Ausnahme, dass ich im Booleschen Fall einen Compilerfehler bekam, der sagte, dass ein Long erwartet wurde. Ich habe mich darum gekümmert, indem ich es zu 'if (b) 1.longValue else 0.longValue' geändert habe. –

+3

Es ist irgendwie verrückt, es gibt keine implizite von int zu lang. Es ist IMMER sicher, das zu tun. – davetron5000

+7

@Russ: Oder du könntest 'if (b) 1L else 0L' schreiben. – missingfaktor

6

Dieser Code ruft für die Verwendung einer Partie:

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 
} 

meine eigene Gefolgt Beratung von meinem Kommentar zu meiner ursprünglichen Antwort ...

+0

Natürlich ist das Problem mit diesem Fall, dass mit dem Objekt Fall zuerst immer übereinstimmen wird. Es sollte bis zum Ende sein. –

+0

Dies wird nicht kompiliert, da Boolean keine Unterklasse von Object ist. – missingfaktor

+1

@Rahul G: Das wäre im Original noch nicht diagnostiziert, aber in diesem Fall manifestiert, ein Zeichen, dass die Verwendung der Scala-Funktionen Ihnen hilft, Typfehler zu entfernen. –

2

Dies könnte ein Anfang sein:

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 
} 

(ich habe nicht etwas außer Kraft zu setzen, und übersprang die try/catch der Kürze halber)

Verwandte Themen