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