Julia的參數化構造函數就是指構造函數類型參數化java
一、定義:函數
定義組合類型的時候能夠不指定具體的參數類型,改用一個大寫字母替代T,那麼這就表示T能夠是任意具體類型
(這個跟Java裏面的泛型相似):code
struct Point{T<:Real} x::T y::T end
這裏的T<:Real 表示T是Real的子孫類
Note: 和Java不一樣的是這裏定義的是一個類型的集合,而java中泛型類只表示帶了一個類型參數而已:
這T不一樣時對應的類型不一樣,Piont{Int32} 和 Piont{Int64} 是不一樣的類型。對象
二、初始化io
定義類型是雖然沒有顯示定義構造函數,可是有默認構造函數能夠用:泛型
1.直接初始化,直接初始化時類型隱含在參數中,
只要x,y的類型相同而且都是Real子孫類就能夠構造函數
Point(1,2) Point(1.2,3.4)
下面這樣會報錯:
Point(1,3.4) 由於兩個參數類型不一樣,一個是Int,一個是Float方法
2.使用帶具體類型的構造函數初始化集合
julia> Point(1,3) Point{Int64}(1, 3) julia> Point(1.2,3.9) Point{Float64}(1.2, 3.9)
不一樣的參數構造出來的類型不一樣兼容
三、構造函數
1 內部構造函數
內部構造函數就是定義在類型內的狗仔函數,若是沒定義,Julia自動提供默認構造函數,也能夠顯示定義,以下的定義和默認構造函數同樣
julia> struct Point{T<:Real} x::T y::T Point{T}(x,y) where {T<:Real} = new(x,y) end
2 外部構造函數
外部構造函數是在類型外部定義的,定義號類型以後能夠在外部定義他的構造函數,外部構造函數只能調用內部構造函數初始化對象
假如咱們但願這樣構造一個對象Point(1,2.3),由於咱們但願數字類型能夠兼容,那麼咱們能夠定義一個外部構造函數
Point(x::Int64, y::Float64) = Point(convert(Float64,x),y)
這裏將Int64轉換爲Float64類型。
如今能夠這樣構造對象:
julia> Point(1,3.9) Point{Float64}(1.0, 3.9)
3. 通用構造方法
若是咱們對每種數字類型都要定義不一樣的外部構造函數顯示轉換的話會很麻煩,能夠這樣定義,對全部的數字類型自動轉換
julia> Point(x::Real, y::Real) = Point(promote(x,y)...); julia> Point(1//2,1) Point{Rational{Int64}}(1//2, 1//1)
如上,前一個是分數,後面是整數, 都轉換成了分數, 類型是Point{Rational{Int64}}, Rational是理數,分數表示,他的分子分母都是Int64