如何在参数类型上定义参数类型?

时间:2017-01-03 22:55:50

标签: julia

假设我有类型

immutable X{T}
    a::T
end

immutable Y{T}
    a::T
end

我想做点什么

type A{T, U}
    x::U{T}
    y::T
end

这样的实例可以是A(X(a), a)A(Y(a), a)

它不起作用 LoadError: TypeError: Type{...} expression: expected Type{T}, got TypeVar

它的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

正如错误所述,UTypeVar,而不是Type。答案是让U成为真正的类型:

julia> abstract U{T}

julia> immutable X{T} <: U{T}
           a::T
       end

julia> immutable Y{T} <: U{T}
           a::T
       end

julia> type A{T}
           x::U{T}
           y::T
       end

julia> A(X(1),1)
A{Int64}(X{Int64}(1),1)

julia> A(X(1),1.)
ERROR: MethodError: no method matching A{T}(::X{Int64}, ::Float64)
Closest candidates are:
  A{T}{T}(::U{T}, ::T) at REPL[4]:2
  A{T}{T}(::Any) at sysimg.jl:53

julia> A(Y(1),1)
A{Int64}(Y{Int64}(1),1)