За начинаещите в 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 г.