2011-11-17 13 views
8

ho questo comportamento che non capiscoConfrontando corda e booleano in un linguaggio di espressione

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

uscite

false 
java.lang.Boolean 
true 
  1. Come può essere exlpained?
  2. Qual è il modo corretto di scrivere il test per testare prima se le due "cose" hanno lo stesso tipo e se il loro valore è lo stesso?
+1

Rimosso il vecchio caso di prova e uno servivano sostituito più compatta e semplice. – Paolo

+0

Molto meglio ':)' –

risposta

13

questo è il comportamento della lingua come definito nel EL specification:

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

  • altre regole eliso
  • Se A o B è Boolean coercitiva A e B a Boolean, applicare l'operatore

Coercizione A a Booleano

  • Se A è nullo o "", return false
  • In caso contrario, se A è un valore booleano, restituisce un
  • In caso contrario, se A è una stringa, e Boolean.valueOf (A) fa non un'eccezione, restituirlo
  • In caso contrario, l'errore

Così, la stringa letterale è costretto ad un valore booleano via Boolean.valueOf("error") quale returns false.

6

Se uno dei lati sia in EL è una Boolean (o boolean) e l'altro lato è un String, allora il String sarà analizzata per Boolean da Boolean#valueOf() cui javadoc dice il seguente:

Restituisce un Boolean con un valore rappresentato dalla stringa specificata. Il valore Boolean restituito rappresenta un valore true se l'argomento stringa non è null ed è uguale, ignorando il caso, alla stringa "true".

Quindi restituisce false e questo è infatti uguale a false.

È necessario riscrivere l'espressione EL per tenere conto del fatto che il tipo può essere sia un booleano che una stringa, o semplicemente attenersi a un singolo tipo e non mescolare i tipi in un singolo attributo.

0

quanto riguarda il punto 2.

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

controllerà che i due 'cose' sono istanze della stessa classe.

Ma potrebbe essere meglio convertire someVar in stringa e quindi confrontare le due stringhe, poiché (almeno nel mio caso) someVar non è garantito che sia una stringa o un booleano, quindi potrebbe essere qualsiasi altra cosa che possa essere convertito in una stringa.

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

che emette

//false 
//class java.lang.String 
//false 
Problemi correlati