Во-первых, в Julia 1.x ограничения подтипа для параметров типа указываются после параметров и сопровождаются зарезервированным словом where
.
function _encode_zigzag(n::T) where {T <: Integer}
num_bits = sizeof(T) * 8
(n << 1) ⊻ (n >> (num_bits - 1))
end
Фигурные скобки не нужны, когда есть только один тип параметра, но рекомендуется сохранить для ясности.
Теперь по второму вопросу. В версии вашего метода, где n - целое число, sizeof не будет работать, так как размер абстрактного типа не определен. В этом случае установление ограничения подтипа помогает убедиться в том, что данный аргумент будет иметь определенный размер, в то же время предоставляя гибкость для различных типов. Юлия скомпилирует разные версии функции; по одному на каждый переданный целочисленный подтип.
Это более эффективно, чем объявление функции с n, имеющим конкретный тип, такой как Int64, поскольку это будет означать, что аргумент должен быть преобразован в тот же тип перед выполнением функции.
Подробнее об этом можно прочитать в документации Джулии .