> I'm trying to do something like this (which doesn't compile in its current
> form):
>
> type ArrayWrapper{T,N,AT <: AbstractArray{T,N}} <: AbstractArray{T,N}
>    arr::AT{T,N}
> end
>
> That is:
>
>    - wrapper around any type AT inherited from AbstractArray{T,N}
>    - wrapper should be itself parametrized by T and N
>    - wrapper should itself extend AbstractArray{T,N}
>
> The code above currently gives an error:
>
> ERROR: TypeError: instantiate_type: expected TypeConstructor, got TypeVar
>
>
>  and the closest thing that works looks like this:
>
> type ArrayWrapper{T,N,AT <: AbstractArray} <: AbstractArray{T,N}
>     arr::AT
> end
>
> which looks too unconstrained.
>
> Is there a way to get what I need?

If you're ok with using immutable (note, you can still modify the array,
just not its binding), this should work:

immutable ArrayWrapper{T,N,AT <: AbstractArray} <: AbstractArray{T,N}
    arr::AT
    function ArrayWrapper(arr)
        @assert T==eltype(arr) && length(size(arr))==N
        new(arr)
    end
end

Reply via email to