рдЬрд╛рд╡рд╛ рдЬреЗрдирд░рд┐рдХ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЬрд╛рд╡рд╛ 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) {
sum += ((Account) account).getAmount();
рдпрджрд┐ рдЖрдк
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;
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдРрд░реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдЬрд░рд┐рдП рдРрд░реЗ рдХреЗ рдХрдВрдЯреЗрдВрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдирдВрдмрд░ 42 рд▓рд┐рдЦ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХреНрдЬреАрдХреНрдпреВрдЯрд┐рд╡ рд╕реНрдЯреЗрдЬ рдкрд░
ArrayStoreException
, рдХреНрдпреЛрдВрдХрд┐ 42 рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдирдВрдмрд░ рд╣реИред рдпрд╣ рдЬрд╛рд╡рд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХрд╛ рджреЛрд╖ рд╣реИ: рд╣рдо рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЪреЗрдХ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреБрдЫ рдкрд╣рд▓реЗ рд╣реА рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред
"рдЬреЗрдирд░рд┐рдХ" рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
List<Integer> ints = Arrays.asList(1,2,3); List<Number> nums = ints;
рдпрджрд┐ рдЖрдк рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░
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);
рдЬрд╡рд╛рдм рд╣реИрдХреНрдпрд╛ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ? extends
? extends
, рдЖрдк рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕реВрдЪреА рдореЗрдВ null
рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - ? super
? super
2. рдореБрдЭреЗ рдиреАрдЪреЗ рджреА рдЧрдИ рд╕реВрдЪреА рд╕реЗ рдХреЛрдИ рдЖрдЗрдЯрдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ?
public static <T> T getFirst(List<? super T> list) { return list.get(0);
рдЬрд╡рд╛рдм рд╣реИрд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдХреЛрдИ рдЖрдЗрдЯрдо рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
? 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);
<?> рдФрд░ рдХрдЪреНрдЪреЗ рдкреНрд░рдХрд╛рд░
рдиреАрдЪреЗ рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд╕реАрдорд┐рдд рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл
<?>
рдХреЛ рдмрд┐рдирд╛
super
рдпрд╛
extends
рдХреАрд╡рд░реНрдб рдХреЗ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
static void printCollection(Collection<?> c) {
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ "рдЕрд╕реАрдорд┐рдд" рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЕрднреА рднреА рдКрдкрд░ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИред
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;
рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреИрдкреНрдЪрд░
рдЕрдм рдЪрд▓реЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
public static void reverse(List<?> list);
рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдХреНрдпреЛрдВрдХрд┐
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 {
рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЪреЗрддрд╛рд╡рдиреА
рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ
Unchecked Warning
рддрдерд╛рдХрдерд┐рдд
Unchecked Warning
рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрддрд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдареАрдХ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред
рдвреЗрд░ рдкреНрд░рджреВрд╖рдг
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ" рдХреА рдУрд░ рдЕрдЧреНрд░рд╕рд░ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "
Heap Pollution
" (рдвреЗрд░ рдкреНрд░рджреВрд╖рдг) рдирд╛рдордХ рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
static List<String> t() { List l = new ArrayList<Number>(); l.add(1); List<String> ls = l;
рд▓рд╛рдЗрди (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;
рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
ArrayList<String> strings = new ArrayList<>(); ArrayList arrayList = new ArrayList(); arrayList = strings;
рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрди (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());
JDK 7 compile-time error. JDK 8 . JEP-101, тАФ . JDK 8 тАФ :
List.cons(42, List.<Integer>nil());
JEP-101 , , :
String s = List.nil().head();
, . , 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
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
,
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.