I remember getting caught on this, as well. I think I had to read the section on Parametric Constructors<http://docs.julialang.org/en/latest/manual/constructors/#parametric-constructors> in the docs about 5 times before finally understanding it. Basically, the implicit constructor is the same as defining the following inner *and* outer constructors:
type Point{T<:Real} x::T y::T Point(x::T, y::T) = new(x,y) end Point{T<:Real}(x::T, y::T) = Point{T}(x,y) If you define any custom inner constructors yourself, the outer constructor is no longer automatically defined for you. There are quite a few very fine semantic points about *why* this kind of definition is required. I still have to re-read that section every now and again to remind myself. But I don't think I can say it any better myself, at least not yet. On Monday, April 21, 2014 3:47:40 PM UTC-4, Spencer Lyon wrote: > > I am having issues defining constructors for parametric types. I’lll > borrow an example from the docs to illustrate my issue: > > Say I define this type: > > type Point1{T} > x::T > y::T > end > > I can then create an object of this type in many ways > > julia> Point1(1.0, 2.0) > Point1{Float64}(1.0,2.0) > > julia> Point1(1, 2) > Point1{Int64}(1,2) > > julia> Point1("1", "2") > Point1{ASCIIString}("1","2") > > julia> Point1('1', '2') > Point1{Char}('1','2') > > julia> methods(Point1) > # 1 method for generic function "Point1": > Point1{T}(x::T,y::T) > > # ect... > > My question is how can I manually define the constructor for this > Parametric type? > > To illustrate my issue, I tried to define a second type Point2 with the > same fields. After reading the documentation sections on types, methods, > and constructors I thought that I might be able to define the inner > constructor as Point2(x, y) = new(x, y) as follows: > > type Point2{T} > x::T > y::T > > Point2(x, y) = new(x, y) > end > > However, this does not work: > > julia> Point2(1.0, 2.0) > ERROR: no method Point2{T}(Float64, Float64) > > julia> methods(Point2) > # 0 methods for generic function "Point2": > > I thought maybe I needed to include the paramter T in the constructor, > but this doesn’t work either: > > type Point2{T} > x::T > y::T > > Point2{T}(x, y) = new(x, y) > end > > It is odd, however, that if I pass in a DataType when calling my > Point2constructor it does work. For example: > > julia> Point2{Float64}(1.0, 2.0) > Point2{Float64}(1.0,2.0) > >