Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 92

Автор Π‘Ρ€ΡŽΡ ЭккСль

НСограничСнныС мСтасимволы

Казалось Π±Ρ‹, Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ мСтасимвол <?<@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 ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΊ Π’ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅: