This is unrelated to optional arguments. You are defining an inner constructor, i.e. a method for AT{T} in the second case which should be called as AT{Int}(1). Define a method for (::Type{AT}){T}(b::T; c = 1) if you want AT(1) to work. (Syntax might become simpler as current conflicting syntax get’s deprecated).
Sorry for asking again, does “(::Type{AT}){T}” have a “name” or something? Is this syntax constructor-specific? Looks totally weird to me oO …
edit:
also, whats the advantage over defining an external constructor AT{T}(b::T; c = 1) = AT{T}(b::T, c) and leaving the inner constructor to default? I wanted to save the external constructor becuase it results in a lot of boiler-plate code with many fields.