julia неверный тип при подтипе параметра c супертип - PullRequest
3 голосов
/ 07 мая 2020

У меня абстрактный тип

abstract type PointND{N<:Integer, T<:Number} end

Когда я делаю его подтип, установка N=1

struct Point1D{T} <: PointND{1, T}
    x::T
end

Юлия выдает ошибку

ERROR: TypeError: in PointND, in N, expected N<:Integer, got Int64

хотя (typeof(1)<:Integer) == true.

Это происходит, даже если N имеет тип Number. Почему это не работает?

1 Ответ

4 голосов
/ 07 мая 2020

Ваш N здесь не подтип Integer, а экземпляр подтипа Integer. Если вы действительно попробуете 1 <: Integer в REPL, это выдаст ошибку. Таким образом, PointND будет принимать только типы подтипа Integer, например Int или UInt, но не экземпляры подтипов Integer, например 1 или 0xff. Решение здесь на самом деле просто не ограничивать тип N вообще, а вместо этого четко задокументировать, что N всегда должно быть целым числом. В настоящее время нет никакого способа ограничить тип экземпляров битовых типов в параметрах типа.

...