рдЧреНрд░реВрд╡реА рдореЗрдВ рдЗрдВрдкреНрд▓рд╛рдВрдЯрд╕ рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЧреНрд░реВрд╡реА рдореЗрд▓-рд▓рд┐рд╕реНрдЯ рдореЗрдВ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ рдерд╛ - рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕реА рд╕реНрдерд┐рд░ рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕реЗ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд▓реЗ рдЧреНрд░реВрд╡реА рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЯрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп рдпреБрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, рдЧреНрд░реВрд╡реА рдХреЗ рдореБрдЦреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ, рдЬреЛрдЪреЗрди "рдмреНрд▓реИрдХрдбреНрд░реИрдЧ" рдерд┐рдпреЛрдбреЛрд░реЛ рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдХреНрд╕рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MyType var = ... рдмрдЬрд╛рдп def = ...) рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдУрд╡рд░рд╣реЗрдб рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд рдФрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдирдХрд╛ рд░реВрдкрд╛рдВрддрд░рдгред

рдЧреНрд░реВрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ 1.7 рддрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рд╕рдВрд╕реНрдХрд░рдг 1.9 рдореЗрдВ рдХрд┐рдП рдЧрдП рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдХреВрд▓рди рдкрд░ рдмрд╣реБрдд рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдиреАрдЪреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкреНрд░рдпреЛрдЧ рд╣реИ рдЬреЛ рдпреЗ рдУрд╡рд░рд╣реЗрдб рдЧреНрд░реЛрд╡реА 1.8.3 рдкрд░ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ - groovy.codehaus.org/From+source+code+to+bytecode , рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ, рдЪрд░рдгреЛрдВ рдореЗрдВ, Groovy рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдПрдХ JVM рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рдЗрдирдкреБрдЯ рдкрдврд╝реЗрдВ рдЦреБрдж рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдПрдХ рд▓реЗрдЦ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ - www.ibm.com/developerworks/ibm/library/it-haggar_bytecode ред



рддреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреЛрдб рд╣реИ:

class NoStrictType { void myMethod1() { def a = 4.2 } } class StrictType { void myMethod1() { int a = 4.2 } } 


рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП (рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рдирд╛):

рдЫрд╡рд┐

рддреЛ рдХреЛрдб рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╣рдо рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдпрд╣ рдХреИрд╢реНрдб рдХреЙрд▓рд╕рд╛рдЗрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡реЗ рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ BigDecimal (рд╕рднреА рдХреЛ рдпрд╛рдж рд╣реИ рдХрд┐ Groovy рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рдЧреИрд░-рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ BidDecimal рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?), рдСрдкрд░реЗрдВрдб рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рджреЛрд╣рд░рд╛рдПрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдкреВрд▓ рд╕реЗ рдорд╛рди 4.2 рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, BigDecimal рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдЗрд╕ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХрд╛ рд▓рд┐рдВрдХ рд░рдЦреЗрдВред рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд╕рд░рдгреА рдХреЗ рджреВрд╕рд░реЗ рд╕реЗрд▓ рдореЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдкреЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред рдлрд┐рд░ рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рд░ рдХреЛрдИ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ, рдЧреНрд░реВрд╡реА рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдмрд┐рдирд╛, рдХреЛрдИ рднреА рд╡рд┐рдзрд┐ рдЕрдВрддрд┐рдо рдЪрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЧрдгрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡рд┐рдзрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рдСрдкрд░реЗрдВрдб рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдЕрдВрддрд┐рдо рд▓рд┐рдВрдХ)ред

рдЕрдм, рджреВрд╕рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕реНрдЯреНрд░рд┐рдХреНрдЯрдЯрд╛рдЗрдк рд╣реИред

рдЫрд╡рд┐

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ? рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ DefaultTypeTransformation.intUnbox () рдореЗрдВ рдХреЙрд▓ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЗрдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред
groovy.codehaus.org/api/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.html
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рдХрд╛рд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рдПрдХ рдЖрджрд┐рдо рд░рд┐рдЯрд░реНрди рдХрд░рддреА рд╣реИред

 public static int intUnbox(Object value) { Number n = castToNumber(value, int.class); return n.intValue(); } 


рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  public static Number castToNumber(Object object, Class type) { if (object instanceof Number) return (Number) object; if (object instanceof Character) { return Integer.valueOf(((Character) object).charValue()); } if (object instanceof GString) { String c = ((GString) object).toString(); if (c.length() == 1) { return Integer.valueOf(c.charAt(0)); } else { throw new GroovyCastException(c, type); } } if (object instanceof String) { String c = (String) object; if (c.length() == 1) { return Integer.valueOf(c.charAt(0)); } else { throw new GroovyCastException(c, type); } } throw new GroovyCastException(object, type); } 


рдХрдИ рдЗрдВрд╕реНрдЯрд╛рдлреЙрдкрд░ рдСрдкрд░реЗрдЯрд░ рдЬреЛ рд╕рдмрд╕реЗ рд╕рд╕реНрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рдХрдИ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг, рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рдорд╛рдкрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдХрд╛рдо рдХреА рдЧрддрд┐ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рд╕реЗ рд╣реА рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рддрдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдпреЛрдЯреЗрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ - рдореВрд▓ рд╡рд┐рдзрд┐ рд╣реА - рдХреЗрд╡рд▓ 10 рдмрд╛рдИрдЯрдХреЛрдбред

Source: https://habr.com/ru/post/In135797/


All Articles