Vergleichen von String und Boolean in Expression-Sprache

8

Ich habe dieses Verhalten, das ich nicht wirklich verstehe

%Vor%

Ausgaben

%Vor%
  1. Wie kann es ausgesagt werden?
  2. Was ist der richtige Weg, um den Test zu schreiben, um zuerst zu testen, ob die beiden "Dinge" den gleichen Typ haben und dann, wenn ihr Wert gleich ist?
Paolo 17.11.2011, 14:32
quelle

3 Antworten

13

Dies ist das Verhalten der Sprache, wie in der EL-Spezifikation definiert:

  

A {==,! =, eq, ne} B

     
  • andere Regeln, die weggelassen wurden
  •   
  • Wenn A oder B boolesch ist, erzwinge sowohl A als auch B boolesch, wende den Operator
  • an   

Erzwinge A zu Boolean

     
  • Wenn A null oder "" ist, gebe false
  • zurück   
  • Andernfalls, wenn A ein Boolescher Wert ist, gebe A
  • zurück   
  • Andernfalls wenn A ein String ist und Boolean.valueOf (A) keine Ausnahme auslöst, geben Sie zurück
  •   
  • Ansonsten, Fehler
  •   

Also wird das String-Literal über Boolean.valueOf("error") in einen booleschen Wert umgewandelt, was gibt false zurück .

    
McDowell 17.11.2011, 16:01
quelle
6

Wenn eine der beiden Seiten in EL eine Boolean (oder boolean ) und die andere Seite eine String ist, wird die String nach Boolean by Boolean#valueOf() , deren < a href="http://download.oracle.com/javase/6/docs/api/java/lang/Boolean.html#valueOf%28java.lang.String%29"> javadoc sagt Folgendes:

  

Gibt Boolean mit einem Wert zurück, der durch die angegebene Zeichenfolge dargestellt wird. Die zurückgegebene Boolean stellt einen true -Wert dar, wenn das Zeichenfolgenargument nicht null ist und unter Beachtung der Groß- / Kleinschreibung der Zeichenfolge "true" entspricht.

Also gibt es false zurück und dies ist tatsächlich gleich false .

Sie müssen Ihren EL-Ausdruck neu schreiben, um zu berücksichtigen, dass der Typ sowohl ein boolescher Wert als auch eine Zeichenkette sein kann, oder nur um einen einzelnen Typ zu behalten und Typen in einem einzelnen Attribut nicht zu mischen.

    
BalusC 17.11.2011 15:59
quelle
0

Wie Punkt 2.

%Vor%

überprüft, ob die beiden "Dinge" Instanzen derselben Klasse sind.

Aber es ist vielleicht besser, someVar in string zu konvertieren, und dann die beiden Strings zu vergleichen, da (zumindest in meinem Fall) someVar nicht garantiert ein String oder Boolean ist, also könnte es alles andere sein kann in einen String konvertiert werden.

%Vor%

Welche Ausgänge

%Vor%     
Paolo 18.11.2011 09:48
quelle

Tags und Links