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
anErzwinge 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 .
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ückgegebeneBoolean
stellt einentrue
-Wert dar, wenn das Zeichenfolgenargument nichtnull
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.
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.
Welche Ausgänge
%Vor%