The crux of the issue, as far as I get, is that Bar{N} is just an alias for Bar{N, K} where {K}.
So, effectively, Julia parses the function definition as
julia> struct Bar{T<:Integer, N}
val::T
end
julia> function (Bar{N, P} where {P})() where {N}
return Bar{Int, N}(1)
end
This is why you can’t call Bar{2} at all if the first type parameter of Bar is constrained to a subtype of Integer.