That's interesting, I can reproduce that exactly. However, when I set the
"a" attribute for A as being Float64, they are both size 8:
abstract ABC
immutable A2 <: ABC
a::Float64
end
julia> bA2, bABC2 = B{A2}(A2(1)), B{ABC}(A2(2))
(B{A2}(A2(1.0)),B{ABC}(A2(2.0)))
julia> sizeof(bA2), sizeof(bABC2)
(8,8)
On Thursday, February 4, 2016 at 2:56:46 PM UTC-5, Josh Langsfeld wrote:
>
> 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
>>>>
>>>
>>>