«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Могут ли ограничения Go Generics Union вызывать общие методы без явного объявления интерфейса?

Могут ли ограничения Go Generics Union вызывать общие методы без явного объявления интерфейса?

Опубликовано 23 декабря 2024 г.
Просматривать:770

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

Вызов методов для ограничений объединения в дженериках Go

В дженериках Go (v1.18) вы можете столкнуться с ограничением объединения типов, которое ограничивает тип параметра к типам, реализующим единый интерфейс. Однако невозможность вызова общих методов среди ограниченных типов вызывает опасения по поводу полезности таких ограничений.

Рассмотрим следующий код:

type A struct {}
type B struct {}
type AB interface { *A | *B }

func (a *A) some() bool { return true }
func (b *B) some() bool { return false }

func some[T AB](x T) bool { return x.some() } // Compiler error

Ошибка компилятора «x.some undefined» связана с тем, что ограничение объединения типов *A | *B не гарантирует существование некоторого метода как в *A, так и в *B.

Чтобы решить эту проблему, вы можете добавить метод в ограничение интерфейса:

type AB interface { *A | *B; some() bool }

func some[T AB](x T) bool { return x.some() } // Works

Это ограничивает T типами, которые реализуют как *A, так и *B и объявляют метод some.

Однако это решение рассматривается как обходной путь для того, что в идеале должно работать только с объединениями типов. Go 1.18 в настоящее время имеет ограничения: компилятор поддерживает вызов метода для значения параметра типа P, только если метод m явно объявлен интерфейсом ограничений P. Несмотря на спецификации языка, гласящие, что набор методов интерфейса представляет собой пересечение наборов методов каждого типа в наборе типов интерфейса. Ожидается, что эта проблема будет решена в Go 1.19.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3