Julia的参数化构造函数就是指构造函数类型参数化

1、定义:


定义组合类型的时候可以不指定具体的参数类型,改用一个大写字母替代T,那么这就表示T可以是任意具体类型
(这个跟Java里面的泛型类似):

struct Point{T<:Real}
           x::T
           y::T
   end 
   

这里的T<:Real 表示T是Real的子孙类
Note: 和Java不同的是这里定义的是一个类型的集合,而java中泛型类只表示带了一个类型参数而已:
这T不同时对应的类型不同,Piont{Int32} 和 Piont{Int64} 是不同的类型。

2、初始化


定义类型是虽然没有显示定义构造函数,但是有默认构造函数可以用:

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)

不同的参数构造出来的类型不同

3、构造函数


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


杜若
70 声望3 粉丝

引用和评论

0 条评论