I may be mistaken, but I think setting the type parameter to be abstract is 
indeed the same as setting the field itself to be abstract. This snippet is 
my evidence:

julia> abstract ABC

julia> immutable A <: ABC
         a::Float32
       end

julia> type B{T<:ABC}
         a::T
       end

julia> bA, bABC = B{A}(A(1)), B{ABC}(A(2))
(B{A}(A(1.0f0)),B{ABC}(A(2.0f0)))

julia> sizeof(bA), sizeof(bABC)
(4,8)

Even though both 'B' objects contain an 'A' immutable, bABC keeps it as a 
pointer (size 8) whereas bA can directly unpack it into the definition.


On Thursday, February 4, 2016 at 1:59:17 PM UTC-5, Christopher Alexander 
wrote:
>
> Oh cool!  I was worried, since my call method was passing in the abstract 
> type if none was specified (ie I wasn't setting a value for the param "a"), 
> that it would just be the same as if I hadn't used a parametric type at all 
> and just set the type of "a" to the abstract type.
>
> Thanks!
>
> Chris
>
> On Thursday, February 4, 2016 at 11:50:07 AM UTC-5, Kevin Squire wrote:
>>
>> No, `a` is the (concrete) type `T`, which is a subtype of `ABC` (and a 
>> new type `B{T}` is created for each `T`).  So you shouldn't lose 
>> performance because of this.
>>
>> Cheers,
>>    Kevin
>>
>> On Thu, Feb 4, 2016 at 8:10 AM, Christopher Alexander <[email protected]> 
>> wrote:
>>
>>> Let's say I have the following types:
>>>
>>> abstract ABC
>>>
>>> type A <: ABC
>>>         a::Float64
>>> end
>>>
>>> type B{T <: ABC}
>>>         a::T
>>> end
>>>
>>> In some cases, I need for type "B" to be incompletely initialized so 
>>> that I can define its parameter "a" later.  I've found out that you can do 
>>> something like this:
>>>
>>> type B{T <: ABC}
>>>         a::T
>>>         
>>>         call(::Type{B}) = new{ABC}()
>>> end
>>>
>>> which then allows this:
>>>
>>> julia> myB = B()
>>> B{ABC}(#undef)
>>>
>>> My question is, I'm assuming you lose any of the performance gain by 
>>> using the parametric type in this case because you are still using the 
>>> abstract type "ABC" for the parameter "a" (even if you define it later with 
>>> a concrete "A").   Is there a better way to do this?
>>>
>>> Thanks!
>>>
>>> Chris
>>>
>>
>>

Reply via email to