Выбор ответа Middle Дженерики обновлено

Параметры типов у методов

Вопрос

Почему нельзя написать func (s *Stack[T]) Map[U any](f func(T) U) *Stack[U]?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: У методов не бывает своих параметров типов, нужна функция. Спецификация разрешает параметры типов только у функций и типов.

Варианты ответа

  1. Можно, методы с параметрами типов разрешены с Go 1.21
  2. Нельзя, потому что Stack должен быть интерфейсом, а не структурой
  3. У методов не бывает своих параметров типов, нужна функцияправильный ответ
  4. Нельзя, потому что U в методе не может быть ограничен any

Разбор

Спецификация разрешает параметры типов только у функций и типов. Методы используют параметры своего ресивера. Причина в том, что методы участвуют в реализации интерфейсов, а интерфейс с обобщённым методом потребовал бы генерации кода в рантайме. Решение: свободная функция func Map[T, U any](s *Stack[T], f func(T) U) *Stack[U]. Ни одна версия Go пока это не разрешила.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.