Java 8 language spec flaw/bug
Davin McCall
davmac at bluej.org
Fri Aug 22 12:49:01 UTC 2014
In the example I gave, the two 'contains' constraints are:
T contains String
T contains StringBuilder
So while you are correct in saying that:
> "is a type T contained in Integer?"
>
> The only possible answer is:
>
> "yes, only if T == Integer."
... the constraint is the wrong way around in your example, compared to
the example I posted. It should rather be:
"is the type Integer contained in T?"
In this case the answer is
"yes, if T is Integer, or a wildcard '? extends (some supertype of
Integer)'.
> Hence the spec derivation of the equality constraint.
This derivation of an equality constraint is too strong, as I have
shown; containment is not equality. I do however take your point about
changing the contains constraint to a sub-type constraint being an
incorrect solution. I suspect now that a full solution would require
significant changes to the current wording of the spec.
Thanks,
Davin
On 22/08/14 10:23, Maurizio Cimadamore wrote:
> I believe the spec is correct as is - note that '<=' denotes a
> 'type-containment' constraint, not a subtyping constraint. To think
> about type-containment it is sometimes useful think about types in
> terms of 'ranges' over simple hierarchies of types (we can let alone
> interfaces, which only makes everything more complex in this regard).
> If you think about an imaginary line that goes from Object to
> 'nulltype' - you will have the following:
>
> Object
> ...
> Number
> ...
> Integer
> ...
> nulltype
>
> Now, ordinary type (such as Number, Integer) can be thought as
> 'points' in this imaginary line. On the other hand, wildcard
> type-arguments are ranges or intervals on this line. For instance, the
> wildcard '? extends Number' is the interval that goes from Number down
> to nulltype. Type-containment answers a very simple question: is the
> interval denoted by one type contained into the interval denoted by
> another type?
>
> Now, using the above metaphore, it is easy to see that if you have a
> point-like type in the RHS of a containment-test:
>
> "is a type T contained in Integer?"
>
> The only possible answer is:
>
> "yes, only if T == Integer."
>
> Hence the spec derivation of the equality constraint.
>
> I hope this helps.
>
> Maurizio
>
>
> On 21/08/14 17:46, Brian Goetz wrote:
>> This turns a 'contains' constraint directly into an 'equals' constraint,
>> which is precisely what causes the problem. I can see no justification
>> for this. It should instead imply a sub-type constraint, that is, it
>> should reduce to ‹S |<:| T›. At this point the problem goes away,
>> without - as far as I can see - having any negative impact on the
>> enhanced type inference that Java 8 provides. Instead of getting two
>> conflicting equality constraints for the T in the Foo example above
>> (T=String and T=StringBuilder), we would get two subtype constraints
>> (String <: T and StringBuilder <: T), which from a theoretical
>> perspective is perfectly correct.
>
More information about the lambda-dev
mailing list