, ! :
julia> abstract type AbstractT end
julia> struct ConcreteT{T} <: AbstractT; end
julia> (::Type{ConcreteT{Int}})() = 1
julia> (::Type{ConcreteT{Float64}})() = 2
julia> ConcreteT{Int}()
1
julia> ConcreteT{Float64}()
2
... :
julia> (::Type{ConcreteT{T}})() where {T<:Number} = 3
julia> (::Type{ConcreteT{T}})() where {T<:AbstractArray} = 4
julia> ConcreteT{Float32}()
3
julia> ConcreteT{UnitRange{Int}}()
4
, :
julia> (::Type{T})() where {T<:AbstractT} = 5
julia> ConcreteT{String}()
ConcreteT{String}()
julia> AbstractT()
5
ConcreteT{String}? , ... , :
julia> methods(ConcreteT{String})
[1] (::Type{ConcreteT{T}})() where T in Main at REPL[2]:1
[2] (::Type{T})() where T<:AbstractT in Main at REPL[12]:1
; , :
julia> (::Type{T})(x) where {T<:AbstractT} = x
julia> ConcreteT{String}(6)
6
julia> ConcreteT{Int}(7)
7