no. that misses the usefulness of abstract types. Here's the answer: abstract A{S} type B{T} <: A{T} end typealias C{T<:A} Ptr{T} z = Ptr{B{Int}}
import Base.eltype eltype{T}(::Type{A{T}}) = T eltype{T<:A}(::Type{T}) = eltype(super(T)) eltype{T}(::Type{C{T}}) = eltype(T) julia> eltype(z) Int64 On Tue, Feb 11, 2014 at 10:45 AM, Tim Holy <tim.h...@gmail.com> wrote: > Does this do it? > > ptype{T}(::Type{Ptr{T}}) = T > btype{T}(b::Type{B{T}}) = T > btype(ptype(z)) > > (One way or another, that is one torturous type nest!) > > --Tim > > On Monday, February 10, 2014 11:26:33 PM Jameson Nash wrote: >> I can't figure this out, so I'm hoping someone will be able to help >> suggest a better way to parametrize this code, or solve my dilemma. >> I've made a somewhat complicate type hierarchy, and now I need to >> extract some information from it. The problem is, given z (or an >> instance thereof), I can't seem to extract S: >> >> >> julia> abstract A{S} >> >> julia> type B{T} <: A{S} end >> >> julia> typealias C{T<:A} Ptr{T} >> Ptr{T<:A{T}} >> >> julia> z = Ptr{B{Int}} >> Ptr{B{Int64}} >> >> julia> # how to go from z -> Int here