ΠΠ΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»Ρ
ΠΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ» <?<@062> Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ·Π½Π°ΡΠ°ΡΡ Β«Π²ΡΠ΅, ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎΒ», Π° Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. Π ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ ΡΡΡ ΠΎΡΠ΅Π½ΠΊΡ:
//: generics/UnboundedWi1dcardsl.java
import java.util.*;
public class UnboundedWildcardsl {
static List listl;
static List<?> list2;
static List<? extends Object> list3;
static void assignldist list) { listl = list; 1i st2 = list;
// list3 = list; // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π½Π΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ // ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½ List, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ List<? extends Object>
}
static void assign2(List<?> list) { listl = list; list2 = list; list3 = list;
}
static void assign3(List<? extends Object> list) { listl = list; list2 = list; list3 = list;
}
public static void main(String[] args) { assignl(new ArrayListO): assign2(new ArrayList()); // assign3(new ArrayListO); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅-// ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½- ArrayList // Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ: List<? extends Object> assignl(new ArrayLi st<String>0); assign2(new ArrayList<String>0); assign3(new ArrayList<String>0); // ΠΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ ΠΎΠ±Π΅ ΡΠΎΡΠΌΡ-List<?> wildList = new ArrayListO; wildList = new ArrayList<String>(); assignl(wildList); assign2(wildList); assign3(wildLi st);
}
} ///:-
ΠΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΡΡ , ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΠΎΠΉ, Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΡΠΈΠΏ ΠΈΠ»ΠΈ <?>. ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ <?> ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ΠΌ; Π²ΠΏΡΠΎΡΠ΅ΠΌ, ΠΎΠ½Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅Π½Π½ΠΎΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ: Β«ΠΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ Java, ΠΈ Π·Π΄Π΅ΡΡ ΡΡΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π½Π΅ ΡΠΎ, ΡΡΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΡΠΈΠΏ, Π° ΡΠΎ, ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΈΠΏΒ».
ΠΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΠΎΠ³Π΄Π° Π²Ρ ΠΈΠΌΠ΅Π΅ΡΠ΅ Π΄Π΅Π»ΠΎ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΠΈΠ½ΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ½ΠΎΡΠΈΡΡΡΡ ΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌΡ ΡΠΈΠΏΡ, Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΡΠΈΠΏΠΎΠΌ:
//: generics/UnboundedWi1dcards2.java
import java.util.*;
public class UnboundedWildcards2 { static Map mapl; static Map<?.?> map2; static Map<String,?> map3; static void assignlCMap map) { mapl = map; } static void assign2(Map<?,?> map) { map2 = map; } static void assign3(Map<String,?> map) { map3 = map; } public static void main(String[] args) { assignl(new HashMapO); assign2(new HashMapO); // assign3(new HashMapO); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: // ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½: HashMap // Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ: Map<String,?> assignl(new HashMap<String,Integer>()); assign2(new HashMap<String,Integer>()); assign3(new HashMap<String.Integer>0):
}
} ///-
ΠΠΎΠ³Π΄Π° Π² Π·Π°ΠΏΠΈΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»Ρ, ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΠ°Ρ<?,?>, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ ΠΎΡ Map. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈΠΌΠ΅Ρ UnboundedWildcardsl.java ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅Ρ List<?> ΠΈ List<? extends Object>.
Π‘ΠΈΡΡΠ°ΡΠΈΡ ΠΎΡΠ»ΠΎΠΆΠ½ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠΈΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ List ΠΈ List<?> (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ), ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅. Π ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π΄ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, List<?> ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠΌ List<Object>, a List, ΠΏΠΎ ΡΡΡΠΈ, ΡΠΎΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ List<Object> β ΠΎΠ΄Π½Π°ΠΊΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠΉ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅ΡΠ΅ ΠΈΡΡΠΈΠ½Π½ΡΠΌ. List Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Β«Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ List, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΏ ObjectΒ», ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ List<?> ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Β«Π½Π΅-Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅-Π²ΡΠΉ List, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏ, Ρ ΠΎΡΡ ΠΌΡ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎΒ».
ΠΠΎΠ³Π΄Π° ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ°Π΅Ρ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΡΠΈΠΏΡ ΠΈ ΡΠΈΠΏΡ Ρ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ? Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»Π°ΡΡ Holder<T>, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΡΠ°Π½Π΅Π΅. ΠΠ»Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Holder, Π½ΠΎ Π² ΡΠ°Π·Π½ΡΡ ΡΠΎΡΠΌΠ°Ρ : Π² Π²ΠΈΠ΄Π΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠΈΠΏΠ°, Ρ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΌ ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ:
//: generics/Wildcards.java // Exploring the meaning of wildcards.
public class Wildcards {
// ΠΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ: static void rawArgs(Holder holder. Object arg) { // holder set(arg); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅-// ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² set(T) ΠΊΠ°ΠΊ ΡΠ»Π΅Π½Π° // Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Holder // holder, set (new WildcardsO); // To ΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅
// ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ: Π½Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ 'Π’' // T t = holder.getO.
// ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ, Π½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΈΠΏΠ° ΡΠ΅ΡΡΠ΅ΡΡΡ Object obj = holder getO.
}
// ΠΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ rawArgsO, Π½ΠΎ ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, static void unboundedArg(Holder<?> holder. Object arg) { // holder.set(arg); // ΠΡΠΈΠ±ΠΊΠ°: // set(capture of ?) in Holder<capture of ?> // Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ (Object) // holder, set (new WildcardsO). // Π’Π° ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ°
// ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ; Π½Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ 'Π’': // T t = holder.get();
// ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ, Π½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΈΠΏΠ° ΡΠ΅ΡΡΠ΅ΡΡΡ: Object obj = holder.getO;
}
static <T> T exactl(Holder<T> holder) { T t = holder.getO; return t;
}
static <T> T exact2(Holder<T> holder. T arg) { holder.set(arg); T t = holder.getO; return t;
}
static <T>
T wildSubtype(Holder<? extends T> holder. T arg) { // holder.set(arg); // ΠΡΠΈΠ±ΠΊΠ°: // set(capture of ? extends T) in // Holder<capture of ? extends T> // cannot be applied to (T) T t = holder.getO; return t;
}
static <T>
void wildSupertype(Holder<? super T> holder, T arg) { holder.set(arg);
// T t = holder.getO; // ΠΡΠΈΠ±ΠΊΠ°:
// ΠΠ΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅ ΡΠΈΠΏΡ: ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ Object, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ T
// ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ, Π½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΈΠΏΠ° ΡΠ΅ΡΡΠ΅ΡΡΡ: Object obj = holder get Π;
}
public static void main(String[] args) {
Holder raw = new Holder<Long>(). // ΠΠ»ΠΈ
raw = new Holder(),
Holder<Long> qualified = new Holder<Long>(), Holder<?> unbounded = new Holder<Long>(). Holder<? extends Long> bounded = new Holder<Long>(), Long Ing = 1L;
rawArgs(raw. Ing), rawArgs(qualified, Ing), rawArgs(unbounded. 1ng). rawArgs(bounded, Ing);
unboundedArg(raw, Ing), unboundedArg(qualified, Ing), unboundedArg(unbounded, Ing), unboundedArg(bounded, Ing),
// Object rl = exactl(raw); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ // ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Holder Π² Holder<T> // ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°: exactlCHolder<T>) // ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ (Holder) Long r2 = exactl(qualified),
Object r3 = exactl(unbounded), // ΠΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Object Long r4 = exactl(bounded),
// Long r5 = exact2(raw, Ing); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ-
// ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Holder Π² Holder<Long>
// ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°. exact2(Holder<T>,T)
// ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ (Holder,Long)
Long Π³Π± = exact2(qualified, Ing),
// Long r7 = exact2(unbounded. Ing), // ΠΡΠΈΠ±ΠΊΠ°-
// exact2(Holder<T>,T) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ
// (Holder<capture of ?>,Long)
// Long r8 = exact2(bounded, Ing), // ΠΡΠΈΠ±ΠΊΠ°.
// exact2(Holder<T>,T) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ
// ΠΊ (Holder<capture of ? extends Long>,Long)
// Long r9 = wildSubtype(raw, Ing); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ
// ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Holder
// ΠΊ Holder<? extends Long>
// ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°-
// wildSubtype(Holder<? extends T>,T)
// ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ (Holder.Long)
Long rlO = wildSubtype(qualified. Ing);
// ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ, Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Object-
Object rll = wildSubtype(unbounded. Ing).
Long rl2 = wildSubtype(bounded. Ing).
// wildSupertype(raw, Ing); // ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ. // ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Holder // ΠΊ Holder<? super Long> // ΠΠ΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°: // wildSupertype(Holder<? super T>,T) // ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ (Holder.Long) wildSupertype(qualified, Ing), // wildSupertype(unbounded, Ing); // ΠΡΠΈΠ±ΠΊΠ°:
// wildSupertype(Holder<? super T>,T) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅&
// ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ (Holder<capture of ?>,Long) // wiIdSupertypeCbounded, Ing); // ΠΡΠΈΠ±ΠΊΠ°: // wildSupertype(Holder<? super T>,T) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ // ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ (Holder<capture of ? extends Long>.Long)
}
} ///:-
Π ΠΌΠ΅ΡΠΎΠ΄Π΅ rawArgs() ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π·Π½Π°Π΅Ρ, ΡΡΠΎ Holder ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΡΠΈΠΏΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π·Π΄Π΅ΡΡ ΠΎΠ½ Π²ΡΡΠ°ΠΆΠ΅Π½ ΠΊΠ°ΠΊ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΡΠΈΠΏ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Object ΠΌΠ΅ΡΠΎΠ΄Ρ set() Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΡΠΈΠΏ, ΠΌΠ΅ΡΠΎΠ΄Ρ set() ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΈ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ Π² Object. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π²Ρ Π»ΠΈΡΠ°Π΅ΡΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΡΠ·ΠΎΠ² get() Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΡ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π’ Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Object.
ΠΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅, ΡΡΠΎ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ Holder ΠΈ Holder<?> β ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ unboundedArgs() Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ β Π² Π½Π΅ΠΌ Π²ΡΡΠ²Π»ΡΡΡΡΡ ΡΠ΅ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½ΠΈΡ Π²ΡΠ΄Π°Π΅ΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠΈΠ±ΠΎΠΊ, Π° Π½Π΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ Holder ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ°Π·Π½ΠΎΡΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ², ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Holder<?> ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ΄Π½ΠΎΡΠΎΠ΄Π½ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
Π exactl() ΠΈ exact2() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΎΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠ² (ΡΠΎ Π΅ΡΡΡ Π±Π΅Π· ΠΌΠ΅ΡΠ°ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²). ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ exact2() ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΠΈΠ½ΡΠΌΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ, Π½Π΅ΠΆΠ΅Π»ΠΈ exactl(), ΠΈΠ·-Π·Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
Π wildSubtype() ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠΈΠΏ Holder ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ Π΄ΠΎ Holder Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠΌΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ extends Π’. Π ΡΠ½ΠΎΠ²Π° ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π’ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΈΠΏΠΎΠΌ Fruit, a holder ΡΠΌΠΎΠΆΠ΅Ρ Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΠΊΠΎΠ½Π½ΠΎ ΡΡΠ°ΡΡ Holder <Apple>. Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Orange Π² Holder<Apple>, Π²ΡΠ·ΠΎΠ²Ρ set() (ΠΈ Π»ΡΠ±ΡΡ Π΄ΡΡΠ³ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΡ Π² Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ°) Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Ρ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΈΠ· Holder<? extends Fruit>, ΠΏΠΎ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΠ²Π»ΡΡΡΡΡ Fruit, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ·ΠΎΠ² get() (ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΈΠΏΠ°) Π΄ΠΎΠΏΡΡΡΠΈΠΌ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ²
ΠΠ»Π°ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΄Π²Π΅ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° β Π²ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΡΠΈΡΠ°Π½ΠΈΡ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΡΡΠΈΡΠ°ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ° ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π°:
II: generics/MultiplelnterfaceVariants.java
II {CompileTimeError} (He ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ)
interface Payable<T> {}
class Employee implements Payable<Employee> {}
class Hourly extends Employee
implements Payable<Hourly> {} ///:-
ΠΠ»Π°ΡΡ Hourly ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΎΠΊΡΠ°ΡΠ°Π΅Ρ Payable<Employee> ΠΈ Payable<Hourly> Π΄ΠΎ Payable, Π° Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ Π±Ρ Π΄Π²ΡΠΊΡΠ°ΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΡ: Π΅ΡΠ»ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠΉ Payable, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΡΠΈ ΡΡΠΈΡΠ°Π½ΠΈΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° ΠΈΠ»ΠΈ instanceof Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠΈΠΏΠ° Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ Π½ΠΈ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ ΡΡΡΠ΅ΠΊΡΡ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ°Π½ΡΡΡΡ Π²ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π² ΡΠΎΡΠΌΠ΅ Object ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΡΡ ΠΊ Π’ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠΊΠ΅: