Julia (ohjelmointikieli)
Rakenne > Tyypit

Julian tyyppijärjestelmä on dynaaminen, nominatiivinen, parametrinen ja yhtenäinen. Kaikilla rakenteilla on jokin tyyppi ajon aikana.
Kielen mukana tulevia tietotyyppejä (typeof()) ovat muun muassa seuraavat:
AbstractString, AbstractChar ja näiden Unicode-UTF-8-alityypit String ja Char. Substring{String} edustaa tekstiviipaletta. Unicode UTF-8 sisältää joitakin monitavuisia merkkejä, joten turvalliseen indeksointiin voidaan käyttää nextind()-, prevind()- tai eachindex()-funktioita.
Number on kaikkien numeroiden (Int64, Real) ylätyyppi.
Missing ja tämän ainoa arvo missing. Numeerisissa ohjelmissa missing tekee tuloksesta epävarman, joten odotettu tulos on yleensä missing. Tämä ei pidä välttämättä paikkaansa muissa tilanteissa, jolloin voidaan käyttää esim. Missings.passmissing tai Base.skipmissing funktioita. Puuttuvia sisältävälle kokoelmalle voidaan kutsua myös collect().
Kaikki funktiot ovat omaa tyyppiänsä ja Function-tyypin alatyyppejä. Funktioita voidaan syöttää funktioihin, käsitellä funktioissa ja palauttaa funktioista muiden arvotyyppien tapaan.
Uusi yhdistelmätyyppi luodaan sanoilla struct Nimi ... end. Instansseja voidaan muokata vain, kun on käytetty mutable struct Nimi ... end, ellei tyypin alkiota olla määritelty sanalla const. Tyyppejä voidaan yhdistää myös tyylillä MaybeInt = Union{Int, Nothing}. Tyyppiparametreja käytetään syntaksilla struct Tyyppi{T} ... end, mikä määrittelee kerralla joukon tyyppejä. Parametrina olevien tyyppien joukko voidaan rajoittaa alatyypeihin tyylillä Tyyppi{T<:YlinTyyppi}. Tyyppi voidaan myös parametrisoida vain osittain syntaksilla Array{T,1} where T. Abstrakteja tyyppejä abstract type Tyyppi <: Supertyyppi end taas ei voida käyttää suoraan vaan ne täytyy ensin konkretisoida. Tämän jälkeen abstraktia tyyppiä voidaan käyttää viittaamaan kaikkiin tämän alatyyppeihin. (Juliassa ei ole olioperusteisemmille kielille tyypillistä perimismekanismia.)
Luodut tyyppiobjektit toimivat itse alustajinaan struct Tyyppi ... end; t = Tyyppi(...). Tämä alustaja on tavallinen funktio, joten sille voidaan määritellä useita metodeja Tyyppi(...) = .... Tyypin alustajaa voidaan käyttää myös tyypin omassa määritelmässä erityisen new()-funktion kautta. Alustettujen arvojen tyyppiä voidaan selvissä tapauksissa muuttaa convert(Tyyppi, arvo)- tai promote(arvo, arvo)-funktiolla. (Numeroita edustaville String-arvoille ("2.54") löytyy oma parse()-funktionsa.)
Tietylle tyypille määritellään metodeja Juliassa tavallisten funktioiden tapaan function f(x::Tyyppi) ... end. Metodi ei kuitenkaan kuulu ainoastaan kyseiselle tyypille vaan kutsuttava metodi valitaan koko funktion tyyppijäljen perusteella (engl. multiple dispatch). Funktionkin tyyppijälki voidaan parametrisoida tyylillä funktio(x::T, y::T, z::T) where {T} ... end (eli tämä metodi valitaan, kun kolmen argumentin tyypit ovat samoja). Näin myös objekteista itsestään voidaan tehdä kutsuttavia (ns. funktoreita) antamalla niiden tyypille metodi tyylillä function (x::Tyyppi)() ... end. Olemassaolevien rajapintojen toteuttaminen tapahtuu toteuttamalla tarvittavien funktioiden metodit – uudesta tyypistä voidaan tehdä muun muassa iteroitava, indeksoitava ja listamainen määrittelemällä sille metodit muutamista erityisistä funktioista kuten iterate, getindex ja size.