0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Дженериками могут быть не только классы и интерфейсы, но и статические методы. Как минимум один обобщенный статический метод нам уже известен:</p>
1
<p>Дженериками могут быть не только классы и интерфейсы, но и статические методы. Как минимум один обобщенный статический метод нам уже известен:</p>
2
<p>В отличие от обычных методов, статические методы не связаны с объектами классов, поэтому обобщенные статические методы существуют сами по себе, независимо от того, является ли класс дженериком или нет. При этом параметр типа у статических методов не указывается, так как он автоматически выводится на основе передаваемых данных. Из-за этого вызов обобщенных статических методов выглядит как вызов обычного метода. Разница же может проявляться тогда, когда вывод типа срабатывает не так, как нам бы того хотелось. В таком случае тип указывается в угловых скобках перед вызовом метода.</p>
2
<p>В отличие от обычных методов, статические методы не связаны с объектами классов, поэтому обобщенные статические методы существуют сами по себе, независимо от того, является ли класс дженериком или нет. При этом параметр типа у статических методов не указывается, так как он автоматически выводится на основе передаваемых данных. Из-за этого вызов обобщенных статических методов выглядит как вызов обычного метода. Разница же может проявляться тогда, когда вывод типа срабатывает не так, как нам бы того хотелось. В таком случае тип указывается в угловых скобках перед вызовом метода.</p>
3
<p>Подробнее о том, в каких случаях это нужно и как работает, мы поговорим в курсах, посвященных ООП.</p>
3
<p>Подробнее о том, в каких случаях это нужно и как работает, мы поговорим в курсах, посвященных ООП.</p>
4
<p>Рассмотрим внутреннее устройство дженериков на примере статического метода identity(), который принимает на вход значение любого типа и возвращает его же наружу.</p>
4
<p>Рассмотрим внутреннее устройство дженериков на примере статического метода identity(), который принимает на вход значение любого типа и возвращает его же наружу.</p>
5
<p>Его определение:</p>
5
<p>Его определение:</p>
6
<p>В определении метода произошло два изменения:</p>
6
<p>В определении метода произошло два изменения:</p>
7
<ul><li>Конкретные типы заменились на имя параметр типа</li>
7
<ul><li>Конкретные типы заменились на имя параметр типа</li>
8
<li>После слова static добавился параметр типа в угловых скобках</li>
8
<li>После слова static добавился параметр типа в угловых скобках</li>
9
</ul><h2>Реальный пример</h2>
9
</ul><h2>Реальный пример</h2>
10
<p>В классе PairUtils реализуем статический метод аналогичный List.of(), который будет создавать новую пару. Начнем с примера использования.</p>
10
<p>В классе PairUtils реализуем статический метод аналогичный List.of(), который будет создавать новую пару. Начнем с примера использования.</p>
11
<p>Внутри метода мы работаем с конкретной парой, поэтому сама пара будет строиться на основе класса SimplePair.</p>
11
<p>Внутри метода мы работаем с конкретной парой, поэтому сама пара будет строиться на основе класса SimplePair.</p>
12
<p>Разберем подробнее, что здесь происходит:</p>
12
<p>Разберем подробнее, что здесь происходит:</p>
13
<ul><li>Добавлены параметры типа <L, R></li>
13
<ul><li>Добавлены параметры типа <L, R></li>
14
<li>В качестве возвращаемого значения указан дженерик SimplePair<L, R>, в который передаются параметры типа <L, R>.</li>
14
<li>В качестве возвращаемого значения указан дженерик SimplePair<L, R>, в который передаются параметры типа <L, R>.</li>
15
<li>В теле создается объект из дженерика SimplePair, с передачей параметров типа метода getPair(). Этот код выглядит как передача параметров метода, во внутренний вызов метода.</li>
15
<li>В теле создается объект из дженерика SimplePair, с передачей параметров типа метода getPair(). Этот код выглядит как передача параметров метода, во внутренний вызов метода.</li>
16
</ul>
16
</ul>