Видео: cs50 на русском week8 Python 2025
Java - отличный способ программирования, но иногда вам нужно будет проявить творческий подход. Для этого вы можете использовать параметры подстановочного типа. Предположим, что у вас есть метод, который объявлен следующим образом:
public void addItems (список ArrayList)
{
// тело метода не показано
}
Мысленный вопрос: скомпилирован ли следующий оператор?
addItems (новый ArrayList ());
Ответ: Нет.
Это удивительно, потому что
String
является подтипом
Object
. Поэтому вы можете подумать, что параметр, который говорит, что он принимает объект
ArrayList
, принимает строки
ArrayList
.
К сожалению, наследование не работает таким образом, когда речь идет о формальных параметрах типа. Вместо этого вам нужно использовать еще одну особенность дженериков, называемых подстановочными знаками.
Короче говоря, если вы хотите создать метод, который принимает любой тип
ArrayList
, вам необходимо закодировать метод следующим образом:
public void addItems (список ArrayList)
В этом случае знак вопроса указывает, что здесь вы можете закодировать любой тип.
Это почти так же хорошо, как наследование, но что, если вы хотите фактически ограничить параметр коллекциями определенного суперкласса? Например, предположим, что вы работаете над системой расчета заработной платы с суперклассом
Employee
с двумя подклассами с именем
HourlyEmployee
и
SalariedEmployee
, и вы хотите, чтобы этот метод принимал
ArrayList
объектов
Employee
,
объектов HourlyEmployee
или
объектов SalariedEmployee
?
В этом случае вы можете добавить предложение
extends
к шаблону, например:
public void addItems (список ArrayList)
Затем вы можете вызвать
метод addItems
с
ArrayList
типа
Employee
,
HourlyEmployee
или
SalariedEmployee
.
Теперь, прежде чем вы назовете это днем, сделайте этот пример еще одним шагом. Предположим, что этот метод
addItems
появляется в универсальном классе, который использует параметр формального типа
, чтобы указать тип элементов class принимает, и вы хотите, чтобы
метод addItems
принял
ArrayList
типа
E
или любой из его подклассов. Для этого вы объявите метод
addItems
следующим образом:
public void addItems (список ArrayList)
Здесь параметр подстановочного типа
просто означает, что
ArrayList < может иметь тип
E
для любого типа, который расширяет
E
.
