рдЖрдпрд╛, рджреЗрдЦрд╛, рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд: рдЬрд╛рд╡рд╛ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдбреВрдмрд╛ рд╣реБрдЖ

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



рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХрд┐рд╕реА рдмреИрдВрдХ рдХреЛ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЦрд╛рддреЛрдВ рдореЗрдВ рдмрдЪрдд рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред "рдЬреЗрдирд░рд┐рдХ" рдХреЗ рдЖрдЧрдорди рд╕реЗ рдкрд╣рд▓реЗ, рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

public long getSum(List accounts) {   long sum = 0;   for (int i = 0, n = accounts.size(); i < n; i++) {       Object account = accounts.get(i);       if (account instanceof Account) {           sum += ((Account) account).getAmount();       }   }   return sum; } 

рд╣рдордиреЗ рдЗрд╕реЗ рдЦрд╛рддреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд, рдЪрд▓рд╛рдпрд╛ рдФрд░ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рддрддреНрд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Account рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ - рдЕрд░реНрдерд╛рдд, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЦрд╛рддрд╛ред рд╣рдорд╛рд░реЗ Account рд╢реНрд░реЗрдгреА рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ getAmount рд╡рд┐рдзрд┐ getAmount , рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдЦрд╛рддреЗ рдореЗрдВ рд░рд╛рд╢рд┐ рд╡рд╛рдкрд╕ рдХрд░ рджреАред рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдФрд░ рдХреБрд▓ рд░рд╛рд╢рд┐ рд▓реМрдЯрд╛ рджреАред рджреЛ рдЪрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:
 if (account instanceof Account) { // (1) 

 sum += ((Account) account).getAmount(); // (2) 

рдпрджрд┐ рдЖрдк Account рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ ( instanceof ), рддреЛ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рдПрдХ ClassCastException рд╕рдВрднрд╡ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдВрдЪ рдЕрдирд┐рд╡рд╛рд░реНрдп рдереАред

рдЬреЗрдирд░рд┐рдХ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдФрд░ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИ:
 public long getSum2(List<Account> accounts) {  long sum = 0;  for (Account account : accounts) {      sum += account.getAmount();  }  return sum; } 

рдЕрдм рд╡рд┐рдзрд┐
 getSum2(List<Account> accounts) 
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдХреЗрд╡рд▓ рд╡рд░реНрдЧ Account рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реА рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗрд╡рд▓ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реВрдЪреА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдЧреНрд░рд╛рд╣рдХ рдЦрд╛рддреЛрдВ рдХреА рд╕реВрдЪреАред

рд╣рдореЗрдВ рдЗрд╕ рд╕реВрдЪреА рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реИ
 List<Account> accounts 
( Account рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП Account рд╡рд░реНрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред

рдЪреЗрдХ рдХреА рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рдЧрд╛рдпрдм рд╣реЛ рдЧрдИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рдВрдХрд▓рди рдордВрдЪ рдкрд░ casting рдЬрд╛рдПрдЧреАред

рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рджреНрдзрд╛рдВрдд


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

рдЯрд╛рдЗрдк
рдЙрдк-рдкреНрд░рдХрд╛рд░
рд╕рдВрдЦреНрдпрд╛
рдкреВрд░реНрдгрд╛рдВрдХ
рд╕реВрдЪреА <рдИ>
ArrayList <E>
рд╕рдВрдЧреНрд░рд╣ <рдИ>
рд╕реВрдЪреА <рдИ>
Iterable <E>
рд╕рдВрдЧреНрд░рд╣ <рдИ>

рдкреНрд░рдХрд╛рд░ / рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдЙрджрд╛рд╣рд░рдг

рдпрд╣рд╛рдБ рдЬрд╛рд╡рд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 Number n = Integer.valueOf(42); List<Number> aList = new ArrayList<>(); Collection<Number> aCollection = aList; Iterable<Number> iterable = aCollection; 

Integer Number рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ Number рдХреЗ рдЪрд░ n рдХреЛ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Integer.valueOf(42) рд╡рд┐рдзрд┐ рд░рд┐рдЯрд░реНрдиред

рдХреЛрд╡рд░рд┐рдпрдирд╕, рдХрдВрдЯреНрд░реЛрд╡рд░реНрд╕реА рдФрд░ рдЗрдирд╡рд┐рд░реЗрдиреНрд╕


рдкрд╣рд▓рд╛, рдереЛрдбрд╝рд╛ рд╕рд┐рджреНрдзрд╛рдВрддред Covariance рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдмрд┐рд▓реНрд▓реА рдЬрд╛рдирд╡рд░реЛрдВ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ <Cats> рдХрд╛ рд╕реЗрдЯ <рдкрд╢реБ> рдХреЗ рд╕реЗрдЯ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдХреЛрдИ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рдХрдИ <рдкрд╢реБ> = рдХрдИ <рдмрд┐рд▓реНрд▓рд┐рдпрд╛рдВ>

рд╡реНрдпреБрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрд▓рдЯрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдмрд┐рд▓реНрд▓реА рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рд╕реЗрдЯ <рдкрд╢реБ> <рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдХреЛрдИ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рдХрдИ <рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ> = рдХрдИ <рдкрд╢реБ>

Invariance - рд╡реНрдпреБрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдХрдореАред рдпрджрд┐ рдмрд┐рд▓реНрд▓реА рдЬрд╛рдирд╡рд░реЛрдВ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ <Cats> рдХрд╛ рд╕реЗрдЯ <рдкрд╢реБ> рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ <рдкрд╢реБ рдХрд╛ рд╕реЗрдЯ <рдХреИрдЯ> рдХрд╛ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрд░реЗрд╡реНрд╕ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реИрдВ ред рдЯрд╛рдЗрдк S[] T[] рдЙрдк-рдкреНрд░рдХрд╛рд░ рд╣реИ T[] рдпрджрд┐ S , T[] рдЙрдк-рдкреНрд░рдХрд╛рд░ рд╣реИ T рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЙрджрд╛рд╣рд░рдг:
 String[] strings = new String[] {"a", "b", "c"}; Object[] arr = strings; 

рд╣рдордиреЗ рдЪрд░ arr рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдПрдХ рд▓рд┐рдВрдХ рд╕реМрдВрдкрд╛, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ ┬л ┬╗ ред рдпрджрд┐ рд╕рд░рдгрд┐рдпрд╛рдБ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдирд╣реАрдВ рдереАрдВ, рддреЛ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдЬрд╛рд╡рд╛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд░рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди рдФрд░ рдЪрд▓рд╛рддрд╛ рд╣реИред

 arr[0] = 42; // ArrayStoreException.       

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдРрд░реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдЬрд░рд┐рдП рдРрд░реЗ рдХреЗ рдХрдВрдЯреЗрдВрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдирдВрдмрд░ 42 рд▓рд┐рдЦ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХреНрдЬреАрдХреНрдпреВрдЯрд┐рд╡ рд╕реНрдЯреЗрдЬ рдкрд░ ArrayStoreException , рдХреНрдпреЛрдВрдХрд┐ 42 рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдирдВрдмрд░ рд╣реИред рдпрд╣ рдЬрд╛рд╡рд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХрд╛ рджреЛрд╖ рд╣реИ: рд╣рдо рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЪреЗрдХ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреБрдЫ рдкрд╣рд▓реЗ рд╣реА рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред

"рдЬреЗрдирд░рд┐рдХ" рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 List<Integer> ints = Arrays.asList(1,2,3); List<Number> nums = ints; // compile-time error.      nums.set(2, 3.14); assert ints.toString().equals("[1, 2, 3.14]"); 

рдпрджрд┐ рдЖрдк рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░ Number рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рди рд╣реА рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрдкреНрд░рдХрд╛рд░ред рд╡рд╣ рдХреЗрд╡рд▓ рд╕реНрд╡рдпрдВ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╛рдиреА List <Integer> рдПрдХ List<Integer> рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрдВрдЯреЗрдЧрд░ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП ints рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдЗрдВрдЯреЗрдЧрд░ рдХреНрд▓рд╛рд╕ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рд╕рдВрдХрд▓рди рдХреЗ рдЪрд░рдг рдореЗрдВ, рдПрдХ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЧрд┐рд░реЗрдЧрд╛ред

рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб


рдХреНрдпрд╛ рдЬреЗрдирд░рд┐рдХ рд╣рдореЗрд╢рд╛ рд╣рдорд▓рд╛рд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ? рдирд╣реАрдВред рдореИрдВ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
 List<Integer> ints = new ArrayList<Integer>(); List<? extends Number> nums = ints; 

рдпрд╣ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реИред List<Integer> - List<? extends Number> рдЙрдкрдкреНрд░рдХрд╛рд░ List<? extends Number> List<? extends Number>

 List<Number> nums = new ArrayList<Number>(); List<? super Integer> ints = nums; 

рдпрд╣ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИред List<Number> рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ List<? super Integer> List<? super Integer> ред

"? extends ..." рдЬреИрд╕реЗ "? extends ..." рд░рд┐рдХреЙрд░реНрдб "? extends ..." рдпрд╛ "? super ..." рдХреЛ рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдпрд╛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдКрдкрд░реА рд╕реАрдорд╛ ( extends ) рдпрд╛ рдПрдХ рдХрдо рдмрд╛рдЙрдВрдб ( super ) рд╣реЛрддрд╛ рд╣реИред List<? extends Number> List<? extends Number> рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдХрдХреНрд╖рд╛ Number рдпрд╛ Number рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИред List<? super Number> List<? super Number> рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдХрдХреНрд╖рд╛ Number рдпрд╛ рдЬрд┐рдирдХреА Number рдПрдХ рдЗрдирд╣реЗрд░рд┐рдЯрд░ ( Number рд╕реЗ рд╕реБрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╣реИред


рдлреИрд▓реА рдмреА - рдКрдкрд░реА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб
рд╕реБрдкрд░ рдмреА - рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдПрдХ рдХрдо рдмрд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде
рдЬрд╣рд╛рдБ B - рд╕реАрдорд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ

рдлреЙрд░реНрдо рдЯреА 2 <= рдЯреА 1 рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯреА 2 рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реЗрдЯ рдЯреА 1 рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реИред

рдпрд╛рдиреА
рд╕рдВрдЦреНрдпрд╛ <=? рдлреИрд▓реА рд╣реБрдИ рд╡рд╕реНрддреБ
? рдлреИрд▓реА рд╕рдВрдЦреНрдпрд╛ <=? рдлреИрд▓реА рд╣реБрдИ рд╡рд╕реНрддреБ
рдФрд░
? рд╕реБрдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ <=? рд╕реБрдкрд░ рдирдВрдмрд░


рд╡рд┐рд╖рдп рдХреА рдЕрдзрд┐рдХ рдЧрдгрд┐рддреАрдп рд╡реНрдпрд╛рдЦреНрдпрд╛

рдЬреНрдЮрд╛рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:

1. рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рд╣реИ? nums рд╕реВрдЪреА рдореЗрдВ рдореИрдВ рдХрд┐рд╕ рдореВрд▓реНрдп рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ?
 List<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); List<? extends Number> nums = ints; nums.add(3.14); // compile-time error 

рдЬрд╡рд╛рдм рд╣реИ
рдХреНрдпрд╛ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ? extends ? extends , рдЖрдк рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕реВрдЪреА рдореЗрдВ null рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - ? super ? super


2. рдореБрдЭреЗ рдиреАрдЪреЗ рджреА рдЧрдИ рд╕реВрдЪреА рд╕реЗ рдХреЛрдИ рдЖрдЗрдЯрдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ?
 public static <T> T getFirst(List<? super T> list) {  return list.get(0); // compile-time error } 

рдЬрд╡рд╛рдм рд╣реИ
рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдХреЛрдИ рдЖрдЗрдЯрдо рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ? super ? super , рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░

 public static <T> Object getFirst(List<? super T> list) {  return list.get(0); } 



рдЧреЗрдЯ рдПрдВрдб рдкреБрдЯ рдкреНрд░рд┐рдВрд╕рд┐рдкрд▓ рдпрд╛ рдкреАрдИрд╕реАрдПрд╕ (рдкреНрд░реЛрдбреНрдпреВрд╕рд░ рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдб рдХрдВрдЬреНрдпреВрдорд░ рд╕реБрдкрд░)


рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рджреЗрддреА рд╣реИред рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрдкрд╡рд╛рдж рдХрд╛ extends рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП null рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдФрд░ super рд▓рд┐рдП Object рдкрдврд╝реЗрдВ)ред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдХрдм рдХреМрди рд╕реЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдкреАрдИрд╕реАрдПрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ - рдирд┐рд░реНрдорд╛рддрд╛ рдЙрдкрднреЛрдХреНрддрд╛ рд╕реБрдкрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред

  • рдпрджрд┐ рд╣рдордиреЗ рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ , рддреЛ рдпрд╣ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ ред рд╡рд╣ рдХреЗрд╡рд▓ "рдЙрддреНрдкрд╛рджрди" рдХрд░рддрд╛ рд╣реИ, рдХрдВрдЯреЗрдирд░ рд╕реЗ рдПрдХ рддрддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдХреБрдЫ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
  • рдЕрдЧрд░ рд╣рдордиреЗ рд╕реБрдкрд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреА рдШреЛрд╖рдгрд╛ рдХреА, рддреЛ рдпрд╣ рдЙрдкрднреЛрдХреНрддрд╛ рд╣реИ ред рд╡рд╣ рдХреЗрд╡рд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ java.util.Collections рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдФрд░ рдкреАрдИрд╕реАрдПрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 public static <T> void copy(List<? super T> dest, List<? extends T> src) { тАж } 

рд╡рд┐рдзрд┐ рдореВрд▓ src рд╕реВрдЪреА рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ dest рд╕реВрдЪреА рдореЗрдВ рдХреЙрдкреА рдХрд░рддреА рд╣реИред src - рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ ? extends ? extends рдФрд░ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ, рдФрд░ dest рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ? super ? super рдФрд░ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рд╣реИред рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк nums рд╕реВрдЪреА рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ nums рд╕реВрдЪреА рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 List<Number> nums = Arrays.<Number>asList(4.1F, 0.2F); List<Integer> ints = Arrays.asList(1,2); Collections.copy(nums, ints); 


рдпрджрд┐ рд╣рдо рдЧрд▓рддреА рд╕реЗ рдХреЙрдкреА рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ nums рд╕реВрдЪреА рд╕реЗ рд▓реЗрдХрд░ nums рд╕реВрдЪреА рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛:
 Collections.copy(ints, nums); // Compile-time error 


<?> рдФрд░ рдХрдЪреНрдЪреЗ рдкреНрд░рдХрд╛рд░


рдиреАрдЪреЗ рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд╕реАрдорд┐рдд рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл <?> рдХреЛ рдмрд┐рдирд╛ super рдпрд╛ extends рдХреАрд╡рд░реНрдб рдХреЗ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
 static void printCollection(Collection<?> c) {  // a wildcard collection  for (Object o : c) {      System.out.println(o);  } } 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ "рдЕрд╕реАрдорд┐рдд" рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЕрднреА рднреА рдКрдкрд░ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИред Collection<?> рднреА рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╣реИ, рдЬреИрд╕реЗ " ? extends Object "ред Collection<?> рдХрд╛ рдПрдХ рд░рд┐рдХреЙрд░реНрдб Collection<?> Collection<? extends Object> Collection<?> рдмрд░рд╛рдмрд░ рд╣реИ Collection<? extends Object> Collection<? extends Object> , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ Object рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ Object - рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдЕрд╕реАрдорд┐рдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рд╕рдВрдХреЗрдд рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ:
 ArrayList arrayList = new ArrayList(); 

рддрдм рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ ArrayList Raw рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░рд┐рдд ArrayList <T> рд╣реИ ред рдХрдЪреНрдЪреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЬреЗрдирд░рд┐рдХ рдХреЗ рдпреБрдЧ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред

рдпрджрд┐ рд╣рдо рдХрдЪреНрдЪреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рд╣рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЧрд╛ "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЙрд▓"ред рдпрджрд┐ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд░реЙ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ" рджреЗрдЧрд╛ред рдЗрди рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддреА рд╣реИред
 ArrayList<String> strings = new ArrayList<>(); ArrayList arrayList = new ArrayList(); arrayList = strings; // Ok strings = arrayList; // Unchecked assignment arrayList.add(1); //unchecked call 


рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреИрдкреНрдЪрд░


рдЕрдм рдЪрд▓реЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 public static void reverse(List<?> list); // ! public static void reverse(List<?> list) { List<Object> tmp = new ArrayList<Object>(list); for (int i = 0; i < list.size(); i++) {   list.set(i, tmp.get(list.size()-i-1)); // compile-time error } } 

рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдХреНрдпреЛрдВрдХрд┐ reverse рд╡рд┐рдзрд┐ рдПрдХ рдЕрд╕реАрдорд┐рдд рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╡рд░реНрдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ <?> рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВред
<?> рдЕрд░реНрде рд╣реИ <? extends Object> <? extends Object> ред рдЗрд╕рд▓рд┐рдП, рдкреАрдИрд╕реАрдПрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░, list producer ред рдФрд░ producer рд╣реА рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╣рдо рд▓реВрдк рдХреЗ рд▓рд┐рдП set() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред list рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬрд╛рд╡рд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд░реЗрдВ? Wildcard Capture рдкреИрдЯрд░реНрди рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ rev рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ T рдПрдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ T рдпрд╣ рд╡рд┐рдзрд┐ T рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдФрд░ рд╣рдо рдПрдХ рд╕реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
 public static void reverse(List<?> list) { rev(list); } private static <T> void rev(List<T> list) { List<T> tmp = new ArrayList<T>(list); for (int i = 0; i < list.size(); i++) {   list.set(i, tmp.get(list.size()-i-1)); } } 

рдЕрдм рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЬрдм reverse(List<?> list) рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ reverse(List<?> list) , рдХреБрдЫ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рд░ рдпрд╛ рдкреВрд░реНрдгрд╛рдВрдХ) рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ X рдПрдХ рдЪрд░ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ T , X

рдЖрдк рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ Wildcard Capture рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрджрд┐ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдКрдкрд░реА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ " ? extends "ред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ " ? super " рдХреА рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

Raw рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ! рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб <?> рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЪрд░ рдкреНрд░рдХрд╛рд░


рдЬрдм рд╣рдо рдХреЛрдг рдХреЛрд╖реНрдардХ рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, <T> рдпрд╛ <E> рд╡рд░реНрдЧ рдпрд╛ рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдПрдХ рдЕрдпреЛрдЧреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдпрд╛ рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдКрдкрд░ рдмрд╛рдВрдзрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
 public static <T extends Comparable<T>> T max(Collection<T> coll) { T candidate = coll.iterator().next(); for (T elt : coll) {   if (candidate.compareTo(elt) < 0) candidate = elt; } return candidate; } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ T extends Comparable<T> , T extends Comparable<T> рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ T (рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ T extends Comparable<T> рдкреНрд░рдХрд╛рд░ рд╕реЗ рдКрдкрд░ рдШрд┐рд░рд╛ рд╣реБрдЖ рд╣реИред рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЯрд╛рдЗрдк рдЪрд░ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖ рдкрд░ рд╕реАрдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ extends )ред super рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, T рдЦреБрдж рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ recursive bound - рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реАрдорд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ Enum рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable 

рдпрд╣рд╛рдБ, Enum рдХреНрд▓рд╛рд╕ рдХреЛ E рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ Enum<E> рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред

рдПрдХрд╛рдзрд┐рдХ рд╕реАрдорд╛рдПрдБ


Multiple Bounds - рдХрдИ рдмрд╛рдзрд╛рдПрдБред рдпрд╣ " & " рд╡рд░реНрдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк T рдПрдХ рдЪрд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЛ Object рдХреНрд▓рд╛рд╕ рдФрд░ Comparable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рд╕реЗ рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) 

рд░рд┐рдХреЙрд░реНрдб Object & Comparable<? super T> Object & Comparable<? super T> рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ Multiple Bounds рдмрдирд╛рддрд╛ рд╣реИред рдкрд╣рд▓реА рд╕реАрдорд╛ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Object - erasure рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЯрд╛рдЗрдк-рдореИрд╢рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ред рдпрд╣ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдХреЗрд╡рд▓ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдКрдкрд░ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╛рдпрд╛рдВ рдмреЙрд░реНрдбрд░ (рдкрд╣рд▓рд╛ рдмрд╛рдзрд╛) рдУрд╡рд░рд░рд╛рдЗрдЯрд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЯрд╛рдЗрдк рдПрд░рд░реНрдпреЛрд░)ред

рдкреНрд░рдХрд╛рд░ рдорд┐рдЯрд╛рдирд╛


рдЯрд╛рдЗрдк рдПрд░рд╛рд╕реБрд░ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдореИрдкрд┐рдВрдЧ рд╣реИ (рд╕рдВрднрд╡рдд: рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдЪрд░ рд╕рд╣рд┐рдд) рдЬреЛ рдХрднреА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЪрд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЯрд╛рдЗрдк T рдореИрд╢рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ |T| ред

рдореИрд╢рд┐рдВрдЧ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
  • рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ G < T1 , ..., Tn > рд╣реИ | рдЬреА |
  • рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЯреАрд╕реА рд╣реИ | рдЯреА | рд╕реА
  • рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЛ T рдкрд░ рдЕрдВрдХрд┐рдд рдХрд░рдирд╛ [] рд╣реИ | рдЯреА | []
  • рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реИрд░рд┐рдПрдмрд▓ рдореИрд╢рд┐рдВрдЧ рдЗрд╕рдХреА рдмрд╛рдИрдВ рд╕реАрдорд╛ рдХреЛ рдореИрд╢рд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ
  • рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдореИрд╢рд┐рдВрдЧ рдХрд░рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реА рд╣реИ


рдЯрд╛рдЗрдк рдПрд░рд╛рд╕реБрд░реЗ (рдЯрд╛рдЗрдк рдореЗрд╢рд┐рдВрдЧ) рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдХрдВрдкрд╛рдЗрд▓рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИ:
  • рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ
  • рдмрд╣реБрд░реВрдкрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд┐рдЬ рддрд░реАрдХреЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ


рдЯреА (рдкреНрд░рдХрд╛рд░)
| рдЯреА | (рдорд╛рд╕реНрдХрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░)
рд╕реВрдЪреА <рдкреВрд░реНрдгрд╛рдВрдХ>, рд╕реВрдЪреА <рд╕реНрдЯреНрд░рд┐рдВрдЧ>, рд╕реВрдЪреА <рд╕реВрдЪреА <рд╕реНрдЯреНрд░рд┐рдВрдЧ >>
рд╕реВрдЪреА
рд╕реВрдЪреА <рдкреВрд░реНрдгрд╛рдВрдХ> []
рд╕реВрдЪреА []
рд╕реВрдЪреА
рд╕реВрдЪреА
рдкреВрд░реНрдгрд╛рдВрдХ
рдкреВрд░реНрдгрд╛рдВрдХ
рдкреВрд░реНрдгрд╛рдВрдХ
рдкреВрд░реНрдгрд╛рдВрдХ
<T рддреБрд▓рдирд╛рддреНрдордХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ <T >>
рддреБрд▓рдиреАрдп
<T рд╡рд╕реНрддреБ рдФрд░ рддреБрд▓рдиреАрдп рд╣реИ <? рд╕реБрдкрд░ рдЯреА >>
рд╡рд╕реНрддреБ
рд▓рд┐рдВрдХреНрдб рдХреЙрд▓реЗрдХреНрд╢рди <рдИ> .рдиреЛрдб
LinkedCollection.Node

рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдореИрд╢рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдк рдПрд░рд╛рд╕реБрд░ред

рдиреАрдЪреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:


рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рдмрд╛рдИрдВ рдУрд░ рд╣реЛрддреА рд╣реИ, рдФрд░ рджрд╛рдИрдВ рдУрд░ рд╕рдм рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХреНрдпреЛрдВ?

рдЬрд╡рд╛рдм рд╣реИ
рдЬрд╛рд╡рд╛ рдореЗрдВ, рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЯрд╛рдЗрдк рдПрд░рд╛рд╕реБрд░реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдмреНрд░рд┐рдЬ рд╡рд┐рдзрд┐ рдХреЛ public int compareTo(Object o) рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред

compareTo(Object o) рд╡рд┐рдзрд┐ рдХреЛ рд╣рдЯрд╛рдХрд░ рдирд╛рдо рд╡рд░реНрдЧ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ javap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рджреЗрдЦреЗрдВ:
 # javap Name.class Compiled from "Name.java" public class ru.sberbank.training.generics.Name implements java.lang.Comparable<ru.sberbank.training.generics.Name> { public ru.sberbank.training.generics.Name(java.lang.String); public java.lang.String toString(); public int compareTo(ru.sberbank.training.generics.Name); public int compareTo(java.lang.Object); } 

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ int compareTo(java.lang.Object) рд╡рд┐рдзрд┐ int compareTo(java.lang.Object) , рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдкреБрд▓ рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рдХ рдиреЗ рдЬреЛрдбрд╝рд╛ рд╣реИред


рд░реЗрдлрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░


рдЬрд╛рд╡рд╛ рдореЗрдВ, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ reifiable рдпрджрд┐ рдЗрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд▓рдн рд╣реИред рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
  • рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ ( рдЗрдВрдЯ , рд▓реЙрдиреНрдЧ , рдмреВрд▓рд┐рдпрди )
  • рдЕрд╕рдВрдЧрдард┐рдд (рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп) рдкреНрд░рдХрд╛рд░ ( рд╕реНрдЯреНрд░рд┐рдВрдЧ , рдкреВрд░реНрдгрд╛рдВрдХ )
  • рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрдирдмрд╛рдЙрдВрдб рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб (рдЕрд╕реАрдорд┐рдд рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╡рд░реНрдг) рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рд╕реВрдЪреА <?> , рд╕рдВрдЧреНрд░рд╣ <?> ) ?
  • рдХрдЪреНрдЪрд╛ (рд╡рд┐рдХреГрдд) рдкреНрд░рдХрд╛рд░ ( рд╕реВрдЪреА , ArrayList )
  • рдПрд░рд░реНрд╕ рдЬрд┐рдирдХреЗ рдШрдЯрдХ рд░реЗрдлрд╝реЗрдХреНрдЯрд┐рд╡ рдкреНрд░рдХрд╛рд░ ( int [] , рд╕рдВрдЦреНрдпрд╛ [] , рд╕реВрдЪреА <?> [] , List [ ) рд╣реИрдВ


рдХреНрдпреЛрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрд▓рдмреНрдз рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдЯрд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг, рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдпрд╣ рдЦреЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЕрдм рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╛рдиреА рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╣реИ - рдХреНрд░рдорд╢рдГ, рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдпред

рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд░рди рд╕рдордп рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдХрд░рд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдЬрд╛рд╡рд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ - рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреА рдкреВрд░реНрдг рдкрд╣реБрдБрдЪ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдХреМрди рд╕реЗ рдкреНрд░рдХрд╛рд░ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ:
  • рдкреНрд░рдХрд╛рд░ рдЪрд░ ( рдЯреА )
  • рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ ( рд╕реВрдЪреА <рд╕рдВрдЦреНрдпрд╛> рдПрд░рд┐рдпрд░рд┐рд╕реНрдЯ <рд╕реНрдЯреНрд░рд┐рдВрдЧ> , рд╕реВрдЪреА <рд╕реВрдЪреА <рд╕реНрдЯреНрд░рд┐рдВрдЧ >> )
  • рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реЗ рдмрд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ ( рд╕реВрдЪреА <; рд╡рд┐рд╕реНрддрд╛рд░ рд╕рдВрдЦреНрдпрд╛>, рддреБрд▓рдиреАрдп <? рд╕реБрдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ> )ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдПрдХ рдЖрд░рдХреНрд╖рдг рд╣реИ: рд╕реВрдЪреА <? рдлреИрд▓реА рд╣реБрдИ рд╡рд╕реНрддреБ> - рдкреБрди: рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд╣реАрдВ рд╣реИ , рд▓реЗрдХрд┐рди рд╕реВрдЪреА <?> - рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп


рдФрд░ рдПрдХ рдФрд░ рдХрд╛рдоред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрд╡рд╛рдж рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

 class MyException<T> extends Exception {  T t; } 

рдЬрд╡рд╛рдм рд╣реИ
рдХреЛрд╢рд┐рд╢-рдХреИрдЪ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреИрдЪ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреНрд░рдорд╢рдГ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХреНрдЬреАрдХреНрдпреВрд╢рди (рдЬреЛ рдХрд┐ рдЗрдВрд╕реНрдЯреЛрдл рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ) рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд рдЕрдкрд╡рд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ, рдХреНрд░рдорд╢рдГ рдЯрд╛рдЗрдк рд░рд┐рдЗрдкреЗрдмрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдереНрд░реЗрдбреЗрдмрд▓ рдФрд░ рдЙрд╕рдХреЗ рд╕рдмрдЯрд╛рдЗрдк рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 class MyException<T> extends Exception {// Generic class may not extend 'java.lang.Throwable'  T t; } 



рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЪреЗрддрд╛рд╡рдиреА


рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ Unchecked Warning рддрдерд╛рдХрдерд┐рдд Unchecked Warning рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрддрд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдареАрдХ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

рдвреЗрд░ рдкреНрд░рджреВрд╖рдг


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ" рдХреА рдУрд░ рдЕрдЧреНрд░рд╕рд░ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ " Heap Pollution " (рдвреЗрд░ рдкреНрд░рджреВрд╖рдг) рдирд╛рдордХ рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 static List<String> t() {  List l = new ArrayList<Number>();  l.add(1);  List<String> ls = l; // (1)  ls.add("");  return ls; } 

рд▓рд╛рдЗрди (1) рдкрд░, рд╕рдВрдХрд▓рдХ "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ" рдХреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИред

рд╣рдореЗрдВ "рд╣реАрдк рдкреНрд░рджреВрд╖рдг" рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рд╣реЛрдЧрд╛ - рдЬрдм рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ Varargs рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, Varargs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ m рд╣реИ List<String>тАж , i.e. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯрд╛рдЗрдк List<String> рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА List<String> ред stringLists рджреМрд░рд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдо рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЯрд╛рдЗрдк stringLists рдХрдЪреНрдЪреА рд╕реВрдЪрд┐рдпреЛрдВ ( List[] ) рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ Object[] array = stringLists; рдФрд░ рдлрд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (1) рдХреА рд╕реВрдЪреА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ array рд▓рд┐рдЦреЗрдВ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ (2) рдореЗрдВ ClassCastException рдХреЛ ClassCastException рджреЗрдЧрд╛ред

 static void m(List<String>... stringLists) {  Object[] array = stringLists;  List<Integer> tmpList = Arrays.asList(42);  array[0] = tmpList; // (1)  String s = stringLists[0].get(0); // (2) } 


рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 ArrayList<String> strings = new ArrayList<>(); ArrayList arrayList = new ArrayList(); arrayList = strings; // (1) Ok arrayList.add(1); // (2) unchecked call 

рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрди (1) рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд┐рдЫрдбрд╝реА рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо add рдореЗрдердб рдХреЛ рд▓рд╛рдЗрди (2) рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ add , рддреЛ рд╣рдореЗрдВ Unchecked call рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓рддреА рд╣реИ - рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдореЗрдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рдХреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкреНрд░рддрд┐рдмрд┐рдВрдм


рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди, рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖рд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  • рд╕рднреА рдкреНрд░рддрд┐рдХреНрд╖реЗрдкрдХ рдкрд░рд╛рд╡рд░реНрддрди рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
  • рдХреНрд▓рд╛рд╕ рдлрд╝реАрд▓реНрдбреНрд╕, рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд░рд╛рд╡рд░реНрддрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред

Reflection Reifiable , . , , , - , :
 java.lang.reflect.Method.getGenericReturnType() 

Generics java.lang.Class . :
 List<Integer> ints = new ArrayList<Integer>(); Class<? extends List> k = ints.getClass(); assert k == ArrayList.class; 


ints List<Integer> ArrayList< Integer> . ints.getClass() Class<ArrayLis> , List<Integer> List . Class<ArrayList> k Class<? extends List> , ? extends . ArrayList.class Class<ArrayList> .

рдирд┐рд╖реНрдХрд░реНрд╖


, Reifiable. Reifiable : , , , Raw , reifiable.

Unchecked Warnings ┬л ┬╗ .

Reflection , Reifiable. Reflection , .

Type Inference


┬л ┬╗. () . :
 List<Integer> list = new ArrayList<Integer>(); 

- Java 7 ArrayList :
 List<Integer> list = new ArrayList<>(); 

ArrayList тАУ List<Integer> . type inference .

Java 8 JEP 101.
Type Inference. :
  • (reduction)
  • (incorporation)
  • (resolution)

: , , тАФ .
, . JEP 101 .

, :
 class List<E> {  static <Z> List<Z> nil() { ... };  static <Z> List<Z> cons(Z head, List<Z> tail) { ... };  E head() { ... } } 

List.nil() :
 List<String> ls = List.nil(); 

, List.nil() String тАФ JDK 7, .

, , , :
 List.cons(42, List.nil()); //error: expected List<Integer>, found List<Object> 

JDK 7 compile-time error. JDK 8 . JEP-101, тАФ . JDK 8 тАФ :
 List.cons(42, List.<Integer>nil()); 


JEP-101 , , :
 String s = List.nil().head(); //error: expected String, found Object 

, . , JDK , :
 String s = List.<String>nil().head(); 


JEP 101 StackOverflow . , , 7- , 8- тАУ ? :
 class Test {  static void m(Object o) {      System.out.println("one");  }  static void m(String[] o) {      System.out.println("two");  }  static <T> T g() {      return null;  }  public static void main(String[] args) {      m(g());  } } 


- JDK1.8:
   public static void main(java.lang.String[]);   descriptor: ([Ljava/lang/String;)V   flags: ACC_PUBLIC, ACC_STATIC   Code:     stack=1, locals=1, args_size=1        0: invokestatic  #6   // Method g:()Ljava/lang/Object;        3: checkcast     #7   // class "[Ljava/lang/String;"        6: invokestatic  #8   // Method m:([Ljava/lang/String;)V        9: return     LineNumberTable:       line 15: 0       line 16: 9 


0 g:()Ljava/lang/Object; java.lang.Object . , 3 (┬л┬╗) , java.lang.String , 6 m:([Ljava/lang/String;) , ┬лtwo┬╗.

- JDK1.7 тАУ Java 7:
   public static void main(java.lang.String[]);   flags: ACC_PUBLIC, ACC_STATIC   Code:     stack=1, locals=1, args_size=1        0: invokestatic  #6   // Method g:()Ljava/lang/Object;        3: invokestatic  #7   // Method m:(Ljava/lang/Object;)V        6: return            LineNumberTable:       line 15: 0       line 16: 6 


, checkcast , Java 8, m:(Ljava/lang/Object;) , ┬лone┬╗. Checkcast тАУ , Java 8.

, Oracle JDK1.7 JDK 1.8 , Java, , .

, Java 8 , Java 7, :

 public static void main(String[] args) { m((Object)g()); } 


рдирд┐рд╖реНрдХрд░реНрд╖


Java Generics . , :


  • Bloch, Joshua. Effective Java. Third Edition. Addison-Wesley. ISBN-13: 978-0-13-468599-1

, Java Generics.

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


All Articles