Вызов методов для ограничений объединения в дженериках 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