Assert#assertThat
è un metodo generico. I tipi primitivi non funzionano con i generici. In questo caso, lo e sono inseriti rispettivamente in Byte
e Integer
.
diventa quindi (entro assertThat
)
Byte b = 0;
Integer i = 0;
b.equals(i);
s' Byte#equals(Object)
controlli di implementazione se l'argomento è di tipo Byte
, tornando false
immediatamente se non lo è.
D'altra parte, è assertEquals
Assert#assertEquals(long, long)
nel qual caso entrambe le byte
e int
argomenti sono promossi al long
valori. Internamente, questo utilizza ==
su due valori primitivi long
uguali.
Si noti che questa conversione boxe funziona perché assertThat
è dichiarato come
public static <T> void assertThat(T actual, Matcher<? super T> matcher) {
dove il byte
è inscatolato ad un Byte
per T
, e il int
è una scatola a un Integer
(all'interno della chiamata a equalTo
), ma dedotto come Number
per corrispondere allo Matcher<? super T>
.
Questo funziona con inferenza generica migliorata di Java 8. Avreste bisogno di argomenti di tipo esplicite per farlo funzionare in Java 7.
fonte
2015-11-26 15:10:14
Perché 'Byte.valueOf ((byte) 0) .equals (Integer.valueOf (0))' è falso. – assylias
Come visto nell'esempio * assylias * 'sopra, il byte diventa auto-box in un oggetto Byte. Come si può vedere nella [same Hamstest docs] di Hamcrest (http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/core/IsEqual.html#equalTo (T)) utilizza Object1.equals (Object2). Poiché sia il byte che l'int sono primitivi, li auto-li impacchetta in oggetti Byte e Integer. Byte1.equals (Intero1) restituirà false, anche se i valori di questi oggetti box sono uguali. –