2011-11-17 8 views
8

tengo este comportamiento no entiendo muy biencuerda y booleano en un lenguaje de expresión

${someVar} 
${someVar.class.name}  
${someVar == 'error'} 

salidas

false 
java.lang.Boolean 
true 
  1. ¿Cómo se puede exlpained?
  2. ¿Cuál es la forma correcta de escribir la prueba para probar primero si las dos "cosas" tienen el mismo tipo y luego si su valor es el mismo?
+1

ha eliminado el antiguo caso de prueba y uno conuna reemplazado más compacto y sencillo. – Paolo

+0

Mucho mejor ':)' –

Respuesta

13

Este es el comportamiento de la lengua como se define en el EL specification:

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

  • reglas elided
  • Si A o B es Boolean coaccione A y B a Boolean, aplique operador

Coerce A to Boolean

  • Si A es nulo o "", return false
  • De lo contrario, si A es un booleano, devolver un
  • De lo contrario, si A es una cadena, y Boolean.valueOf (a) ¿ no lanzar una excepción, devolverlo
  • de lo contrario, el error

Así, la cadena literal es forzado a través de un booleano Boolean.valueOf("error") que returns false.

6

Si uno de los dos lados de EL es un Boolean (o boolean) y el otro lado es una String, entonces el String será analizado a Boolean por Boolean#valueOf() cuya javadoc dice lo siguiente:

Devuelve Boolean con un valor representado por la cadena especificada. El Boolean devuelto representa un valor de true si el argumento de cadena no es null y es igual, ignorando el caso, a la cadena "verdadero".

Por lo tanto, devuelve false y de hecho es igual a false.

Tiene que volver a escribir su expresión EL para tener en cuenta que el tipo puede ser tanto booleano como de cadena, o simplemente para ajustarse a un solo tipo y no mezclar tipos en un solo atributo.

0

Como para el punto 2.

<c:set var="errorString" value="${'error'}" /> 
${someVar.class == errorString.class} 

comprobará que el dos 'cosas' son instancias de la misma clase.

Pero podría ser mejor convertir someVar en una cadena, y luego comparar las dos cadenas, ya que (al menos en mi caso) someVar no garantiza que sea una Cadena o un Booleano, por lo que podría ser cualquier otra cosa que pueda ser convertido a una Cadena.

<c:set var="strsomeVar">${someVar}</c:set> 
//${someVar} 
//${someVar.class} 
//${someVar == 'error'} 

que da salida a

//false 
//class java.lang.String 
//false 
Cuestiones relacionadas