За начинаещите в Java (като мен) е трудно да разберат Generics Wildcards на пръв поглед. В тази публикация ще се опитам да обясня този труден урок, който научих, докато го проучвах. Направих някои проверки в интернет, но в този момент не намерих добър отговор за мен.
JT е колекция от JavaTricks, които предполагам, че е полезно да знаете
Въведение
В тази публикация ще обясня как разбирам <? extends T>
и <? super T>
, надявам се, че можете да получите нещо, след като прочетете тази публикация.
Заместващи символи с горна граница
Вижте примера по-долу
Да, странно е, ако знаете какво означава ключова дума extends
?
Какво мислите<? extends A>
е всеки тип, който е подклас на A
, следователно B
и C
са подходящи класове.
Какво мисли компилаторът<? extends A>
е всеки тип, който е подклас на A
, следователно списъкът може да съдържа B
, C
или дори A
елементи, това прави списъка непредвидим или причинява потенциални проблеми.
Обобщение
В този случай трябва да мислим за <? extends A>
като референция (или метод за получаване) вместо setter
. Моля, разгледайте новия код
Заместващи символи с долна граница
Отново проверяваме примера по-долу
Да, това те кара да се объркваш отново.
Какво мислите<? super B>
е всеки тип, който е суперклас на B
, следователно очевидно A
е приемлив тип.
Какво мисли компилаторът<? super B>
е всеки тип, който е суперклас на B
, следователно може да е B
или който и да е подклас на B
, но не трябва да е A
, тъй като в крайна сметка може да извлече B
от предоставен тип.
Резюме
Можем да използваме <? super B>
, за да добавим елемент към списъка (с други думи, да използваме като настройка)
Разширен пример
И накрая, стигаме до пример за напреднали, за да разберем какво знае компилаторът
- Ред
40
не се компилира, защото знае, че списъкът може да съдържаB
или който и да е подклас наB
, следователно всички те са разширени отObject
, следователно приема само методи отObject
- Ред
47
не се компилира, тъй като разбира, че списъкът в крайна сметка съдържа обекти, които се простират отB
, така че приема само методи, които принадлежат наB
, освен товаB
разширяваA
, така че методите наA
също са приемливи.
Заключение
Понякога е доста объркващо в началото, добре е да се потопите по-дълбоко в знанията и примерите за Java, за да разберете напълно начина на мислене. Всички предложения са високо оценени.
Първоначално публикувано в dotronglong.com на 30 октомври 2018 г.