型とその階層構造
Julia の型は、具体型(concrete type)と抽象型(abstract type)に分けられる。 プリミティブ型はすべて具体型だ。
型は階層構造をなしていて、抽象型は具体型の親、あるいはその親…になっている。
親(supertype)の型は supertype 関数で確認できる。
julia> supertype(Float64)
AbstractFloat
一方、どんな型を子(subtype)に持つかは subtypes 関数。
julia> subtypes(AbstractFloat)
5-element Vector{Any}:
BigFloat
Core.BFloat16
Float16
Float32
Float64
階層構造は多数の階層があり、遡っていくと Any 型に行き着く。
julia> supertype(Float64)
AbstractFloat
julia> supertype(AbstractFloat)
Real
julia> supertype(Real)
Number
julia> supertype(Number)
Any
julia> supertype(Any)
Any
Any はすべての型のおおもとの親ってわけだ。
抽象型は、インスタンス化することができない。言い換えると、何かの値の型はすべて具体型だ。
例えば、浮動小数点数は一般に Float16、Float32、Float64 のいずれかで、AbstractFloat ではない。
型を指定するには :: の後に型名をつける。変数のほか、関数の引数や返り値などにつけることができる。
julia> x::Int = 8
8
julia> typeof(x)
Int64
julia> y = 8::Int64
8
julia> typeof(y)
Int64
