рдЕрднрд┐рд╡рд╛рджрди, рдкрд╛рдардХ!
рдпрд╣ рд▓реЗрдЦ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдЪреЗрддрдирд╛ рдХреА рдзрд╛рд░рд╛ рдХреЛ рдкрддрд▓рд╛ рдХрд░реЗрдЧрд╛ред рдЖрдЗрдП рдЬрд╛рд╡рд╛ рдФрд░ рдЖрдкрдХреЗ рдЖрд╕-рдкрд╛рд╕ рдРрд╕реА рдордЬрд╝реЗрджрд╛рд░ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рд╢рд╛рдпрдж рдирд╣реАрдВ рдЬрд╛рдирддреЗред рдореИрдВрдиреЗ рдЦреБрдж рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рдардХ рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖рдг рдкрд╛рдПрдВрдЧреЗред
рдореБрдЦрд░ 2 рддрд░реНрдХ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ
рдЖрдорддреМрд░ рдкрд░, assert
рдЙрдкрдпреЛрдЧ рдХреБрдЫ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ AssertionError
рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЪреЗрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
assert list.isEmpty();
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
assert list.isEmpty() : list.toString();
рд╕реНрдорд╛рд░реНрдЯ рд░реАрдбрд░ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рд╕рдВрдпреЛрдЧрд╡рд╢, рдпрд╣ рдЖрд▓рд╕реА рд╣реИ) рдЯрд╛рдЗрдк Object
рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ AssertionError
рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ: https://docs.oracle.com/javase/specs/jls/se13/html/jls-14.html#jls-14.10
рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рдЧрднрдЧ рд╕рд╛рдврд╝реЗ 6 рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ assert
рдХреАрд╡рд░реНрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЙрдкрдпреЛрдЧ рджреЗрдЦрд╛ рд╣реИред
strictfp
рдпрд╣ рдПрдХ рдЕрднрд┐рд╢рд╛рдк рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдПрдХ рдЕрд▓реНрдкрдЬреНрдЮрд╛рдд рдЦреЛрдЬрд╢рдмреНрдж рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдЕрдВрдХрдЧрдгрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
public interface NonStrict { float sum(float a, float b); }
рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
public strictfp interface Strict { float sum(float a, float b); }
рд╕рд╛рде рд╣реА, рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
public interface Mixed { float sum(float a, float b); strictfp float strictSum(float a, float b); }
рд╡рд┐рдХреА рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдпрд╣ рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдкрд░ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рд╕рдЯреАрдХрддрд╛ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЬрд╛рд░реА рд░рдЦрдирд╛ рдПрдХ рддрд░реНрдХ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ
рдореБрдЭреЗ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ред рдЖрдорддреМрд░ рдкрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
for (Item item : items) { if (item == null) { continue; } use(item); }
рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрд░реНрде рд╣реИ рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдЧрд▓реЗ рдкрд╛рд╕ рдХреА рд╡рд╛рдкрд╕реАред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
loop: for (Item item : items) { if (item == null) { continue loop; } use(item); }
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЪрдХреНрд░ рд╕реЗ рдмрд╛рд╣реНрдп рдЪрдХреНрд░ рдкрд░ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ:
@Test void test() { outer: for (int i = 0; i < 20; i++) { for (int j = 10; j < 15; j++) { if (j == 13) { continue outer; } } } }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ outer
рдмрд┐рдВрджреБ рдкрд░ рд▓реМрдЯрдиреЗ рдкрд░ рдХрд╛рдЙрдВрдЯрд░ рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реВрдк рдкрд░рд┐рдорд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЬрдм рдХреЛрдИ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╡рд╛рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ
рдЬрдм рд╣рдо рдмрд╛рд╣рд░ рд╕реЗ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреА рдХреЙрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ:
@Benchmark public Object invokeVararg() { return vararg(); }
рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рдкрд╛рдП, рдХреНрдпрд╛ рд╣рдордиреЗ? рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрдВрджрд░ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд░рд╕реАрд▓рд╛ рдирд╣реАрдВ рд╣реИ:
public Object[] vararg(Object... args) { return args; }
рдЕрдиреБрднрд╡ рдЪрд┐рдВрддрд╛рдУрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ:
Benchmark Mode Cnt Score Error Units invokeVararg avgt 20 3,715 ┬▒ 0,092 ns/op invokeVararg:┬╖gc.alloc.rate.norm avgt 20 16,000 ┬▒ 0,001 B/op invokeVararg:┬╖gc.count avgt 20 257,000 counts
рдЖрдк null
рд╣реЛрдХрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд░реНрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
@Benchmark public Object invokeVarargWithNull() { return vararg(null); }
рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ:
invokeVarargWithNull avgt 20 2,415 ┬▒ 0,067 ns/op invokeVarargWithNull:┬╖gc.alloc.rate.norm avgt 20 тЙИ 10тБ╗тБ╡ B/op invokeVarargWithNull:┬╖gc.count avgt 20 тЙИ 0 counts
null
рд╕рд╛рде рдХреЛрдб рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рд▓рдЧрддрд╛ рд╣реИ, рд╕рдВрдХрд▓рдХ (рдФрд░ рдЖрдЗрдбрд┐рдпрд╛) рд╢рдкрде рд▓реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд░реНрдо рдХреЛрдб рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░реЗрдВред
рд╕реНрд╡рд┐рдЪ-рдХреЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди java.lang.Class рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдпрд╣ рдХреЛрдб рдЕрднреА рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ:
String to(Class<?> clazz) { switch (clazz) { case String.class: return "str"; case Integer.class: return "int"; default: return "obj"; } }
рдЗрд╕рд╕реЗ рдирд┐рдкрдЯреЛред
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ Class.isAssignableFrom () рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ
рдПрдХ рдХреЛрдб рд╣реИ:
int a = 0; Integer b = 10; a = b;
рдЕрдм рд╕реЛрдЪреЗрдВ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд┐рд╕ рдореВрд▓реНрдп рдкрд░ рд▓реМрдЯреЗрдЧреА:
boolean check(Integer b) { return int.class.isAssignableFrom(b.getClass()); }
Class.isAssignableFrom()
рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, Class.isAssignableFrom()
рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ int.class.isAssignableFrom(b.getClass())
true
рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЛ int
рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рд╣рд╛рд▓рд╛рдБрдХрд┐, check()
рд╡рд┐рдзрд┐ false
рдЖрдПрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐:
@HotSpotIntrinsicCandidate public native boolean isAssignableFrom(Class<?> cls);
рд╣рд╛рд▓рд╛рдВрдХрд┐ int
Integer
(рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рдЖрдкрд╕реА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рднрд╛рд╖рд╛ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЧреБрдорд░рд╛рд╣ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд░рдХреНрд╖рдг рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдиреИрддрд┐рдХ: рдЬрдм рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ - рдмрдкрддрд┐рд╕реНрдорд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХ рдФрд░ рддрдереНрдпрд╣реАрди рддрдереНрдп рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ:
assert int.class != Integer.class;
int.class
рдХреНрд▓рд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Integer.TYPE
, рдФрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдпрд╣ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
Class<?> toClass() { return int.class; }
Vzhuh:
toClass()Ljava/lang/Class; L0 LINENUMBER 11 L0 GETSTATIC java/lang/Integer.TYPE : Ljava/lang/Class; ARETURN
Java.lang.Integer рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛрд▓рдирд╛ java.lang.Integer
рд╣рдо рдЗрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ:
@SuppressWarnings("unchecked") public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
Class.getPrimitiveClass("int")
рдкрд░ рдХреЙрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП Class.getPrimitiveClass("int")
рдЗрд╕реЗ рдХрд╛рдЯрдиреЗ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
@SuppressWarnings("unchecked") public static final Class<Integer> TYPE = int.class;
рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ (рд╕рднреА рдкреНрд░рд╛рдЗрдореЗрдЯреАрдЬрд╝ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде JDK рдЗрдХрдЯреНрдард╛ рд╣реЛрдЧрд╛, рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╢реБрд░реВ рд╣реЛрдЧреАред рд╕рдЪ рд╣реИ, рд╡рд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА:
java.lang.IllegalArgumentException: Component type is null at jdk.internal.misc.Unsafe.allocateUninitializedArray(java.base/Unsafe.java:1379) at java.lang.StringConcatHelper.newArray(java.base/StringConcatHelper.java:458) at java.lang.StringConcatHelper.simpleConcat(java.base/StringConcatHelper.java:423) at java.lang.String.concat(java.base/String.java:1968) at jdk.internal.util.SystemProps.fillI18nProps(java.base/SystemProps.java:165) at jdk.internal.util.SystemProps.initProperties(java.base/SystemProps.java:103) at java.lang.System.initPhase1(java.base/System.java:2002)
рддреНрд░реБрдЯрд┐ рдпрд╣рд╛рдБ рдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИ:
class java.lang.StringConcatHelper { @ForceInline static byte[] newArray(long indexCoder) { byte coder = (byte)(indexCoder >> 32); int index = (int)indexCoder; return (byte[]) UNSAFE.allocateUninitializedArray(byte.class, index << coder);
рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, byte.class
рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрдВрдбрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ
рдореИрдВ рдПрдХ рдЙрддреНрд╕реБрдХ рдЧрд▓рддреА рдХреЗ рд╕рд╛рде рд▓реЗрдЦ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯ рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЗ рдЬрдВрдХреНрд╢рди рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдерд╛ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЗрдХрд╛рдИ рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рднрдВрдбрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:
@Entity public class SimpleEntity { @Id private Integer id; @Column private String name; } public interface SimpleRepository extends JpaRepository<SimpleEntity, Integer> { }
рдЕрдиреБрднрд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрдн рдЙрдард╛рддреЗ рд╕рдордп, рд╕реНрдкреНрд░рд┐рдВрдЧ рджрд┐рдирд╛рдВрдХ рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ рдФрд░ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рддреБрд░рдВрдд рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреНрд╡реЗрд░реА рд╡рдХреНрд░:
public interface SimpleRepository extends JpaRepository<SimpleEntity, Integer> { @Query(", , ?") Optional<SimpleEntity> findLesserOfTwoEvils(); }
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рднреА рд╣рдореЗрдВ рдПрдХ рдореБрдЦреНрдп рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ:
public interface SimpleRepository extends JpaRepository<SimpleEntity, Long> { }
рдпрд╣ рднрдВрдбрд╛рд░ рди рдХреЗрд╡рд▓ рдмрдврд╝реЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд╛рд▓рди рднреА рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, findAll()
рд╡рд┐рдзрд┐ "рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде" рдХрд╛рдо findAll()
ред рд▓реЗрдХрд┐рди рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ:
IllegalArgumentException: Provided id of the wrong type for class SimpleEntity. Expected: class java.lang.Integer, got class java.lang.Long
рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рджрд┐рдирд╛рдВрдХ рдЗрдХрд╛рдИ рдХреБрдВрдЬреА рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдХреБрдВрдЬреА рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреЗ рдЬреАрд╡рди рд╕реЗ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд╣реА рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдг: https://hibernate.atlassian.net/browse/HHH-10690
рдореЗрд░реЗ рдЬреАрд╡рди рдореЗрдВ рдореБрдЭреЗ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдорд┐рд▓рд╛: рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯреНрд╕ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ (рдЯреНрд░реЙрд▓реА) рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, org.springframework.data.jpa.repository.query.PartTreeJpaQueryIntegrationTests$UserRepository
Long
рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ Integer
, рдФрд░ User
рдЗрдХрд╛рдИ рдореЗрдВ Integer
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рдпрд╣ рд╕рдм, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдореАрдХреНрд╖рд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдереАред
рдореИрдВ рдЖрдкрдХреЛ рдирдП рд╕рд╛рд▓ рдХреА рдмрдзрд╛рдИ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдЖрдкрдХреЛ рдЧрд╣рд░реА рдФрд░ рд╡реНрдпрд╛рдкрдХ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ!