An array can take elements of different types. Therefore, we can have, for example, arrays of the following types: Array{Int64,1}
, Array{Int8,1}
, Array{Float64,1}
, or Array{String, 1}
, and so on. That is why an Array
is a parametric type; its elements can be of any arbitrary type T
, written as Array{T, 1}
.
In general, types can take type parameters, so that type declarations actually introduce a whole family of new types. Returning to the Point
example of the previous section, we can generalize it to the following:
# see the code in Chapter 6\parametric.jl mutable struct Point{T} x::T y::T end
This abstract type creates a whole family of new possible concrete types (but they are only compiled as needed at runtime), such as Point{Int64}
, Point{Float64}
, and Point{String}
.
These are all subtypes of Point
: Point{String} <: Point
returns true
. However, this is not the case when...