سیستم نوع در جولیا
سلسلهمراتب انواع، انواع انتزاعی و مشخص، isa و عملگر <:
سیستم نوع جولیا
جولیا سیستم نوع پویا اما غنی دارد — لازم نیست نوع بنویسید، اما وقتی بنویسید کد سریعتر و امنتر میشود!
سلسلهمراتب انواع
همه انواع در جولیا یک درخت تشکیل میدهند با ریشه Any:
Any
├── Number
│ ├── Real
│ │ ├── Integer
│ │ │ ├── Int64, Int32, ...
│ │ └── Bool
│ │ └── AbstractFloat
│ │ └── Float64, Float32
│ └── Complex
├── AbstractString
│ └── String
├── AbstractArray
│ └── Array
└── ...
isa — بررسی نوع
println(42 isa Int64) # true
println(3.14 isa Float64) # true
println(3.14 isa Number) # true! (Float64 فرزند Number است)
println("سلام" isa String) # true
println([1,2] isa Array) # true
عملگر <: — زیرنوع
println(Int64 <: Number) # true (Int64 زیرنوع Number)
println(Float64 <: Real) # true
println(String <: Number) # false!
println(Integer <: Number) # true
<: یعنی «زیرنوع است» — برای بررسی روابط نوع در dispatch خیلی کاربرد دارد!supertype و subtypes
println(supertype(Int64)) # Signed
println(supertype(Integer)) # Real
println(subtypes(Integer))
-- [Bool, Signed, Unsigned]
انواع انتزاعی در برابر مشخص
| نوع | مثال | میتوان ساخت؟ |
|---|---|---|
| انتزاعی (Abstract) | Number, Real, Integer | ❌ فقط برای dispatch |
| مشخص (Concrete) | Int64, Float64, String | ✅ مقدار واقعی |
x = 42
println(typeof(x)) # Int64 (نوع مشخص)
println(supertype(typeof(x))) # Signed
چرا سیستم نوع مهم است؟
- سرعت: کامپایلر با نوع مشخص، کد بهینه تولید میکند
- dispatch: انتخاب متد بر اساس نوع
- امنیت: خطاها قبل از اجرا پیدا میشوند
تبدیل و بررسی
x = 42
println(x isa Integer) # true
println(x isa Real) # true
println(x isa Any) # true — همه چیز Any است!
# تبدیل نوع
println(convert(Float64, 10)) # 10.0
در جولیا نوعها «اختیاری اما قدرتمند» هستند — میتوانید بدون نوع بنویسید (مثل پایتون) اما با نوع، سرعت C بگیرید!
این مبحث بخشی از دوره آموزش کامل جولیا است.