Невозможно делать то, что вы хотите, используя абстрактные типы в Юлии. Union
- это способ представить ваше требование.
Теперь, чтобы понять, почему вы заметили, что в системе типов Julia у вас есть три ограничения:
- Только абстрактные типы могут иметь подтипы.
- Тип может иметь только один супертип.
- Вы должны указать супертип типа при его определении.
Таким образом, мы знаем, что типы создают древовидную структуру с корнем Any
(за исключением Union{}
, который не имеет значений и является подтипом всех других типов, но вам, вероятно, это не понадобится) на практике).
Ваше определение будет нарушать правило № 2 и правило № 3. Обратите внимание, что все эти типы уже определены (либо в Base, либо в пакете), поэтому вы не можете переопределить их (правило № 3). Также у них уже есть супертип, поэтому вы не можете добавить другой (правило № 2). Смотрите, например, результат этого вызова:
julia> supertype(Array{Float64, 1})
DenseArray{Float64,1}
И вы видите, что Array{Float64, 1}
уже определен и имеет супертип.
Сказав, что, возможно, вам будет достаточно другого более общего определения:
const FloatOrMissingVector = AbstractVector{<:Union{Float64, Missing}}
Это определение имеет два отличия:
- Он допускает другие, чем плотные векторы (что, я думаю, в любом случае вам и нужно, поскольку обычно вам все равно, является ли вектор плотным или разреженным)
- Это позволило бы, например,
Vector{Missing}
как подтип (то есть структура, содержащая только пропущенные значения) - если вы хотите исключить это, вам нужно будет указать объединение, как вы предложили выше.