HTML Diff
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>Добавлены параметры типа &lt;L, R&gt;</li>
13 <ul><li>Добавлены параметры типа &lt;L, R&gt;</li>
14 <li>В качестве возвращаемого значения указан дженерик SimplePair&lt;L, R&gt;, в который передаются параметры типа &lt;L, R&gt;.</li>
14 <li>В качестве возвращаемого значения указан дженерик SimplePair&lt;L, R&gt;, в который передаются параметры типа &lt;L, R&gt;.</li>
15 <li>В теле создается объект из дженерика SimplePair, с передачей параметров типа метода getPair(). Этот код выглядит как передача параметров метода, во внутренний вызов метода.</li>
15 <li>В теле создается объект из дженерика SimplePair, с передачей параметров типа метода getPair(). Этот код выглядит как передача параметров метода, во внутренний вызов метода.</li>
16 </ul>
16 </ul>