Type equality for values
Brian Goetz
brian.goetz at oracle.com
Sat Aug 2 04:19:45 UTC 2014
They have no shared top type. Int is convertible to long, not a subtype.
Sent from my iPhone
> On Aug 1, 2014, at 4:16 PM, Alex Meiburg <timeroot.alex at gmail.com> wrote:
>
> Wouldn't that idea that "mutually castable types" suggest that int and long
> should work, though -- in the sense that they can still be cast from one to
> the other, even if this casting isn't because of a shared top type?
>
> -- Alexander Meiburg
>
>
> 2014-08-01 13:54 GMT-07:00 Brian Goetz <brian.goetz at oracle.com>:
>
>> If the thing being compared is a value, I think we want “must”; if the
>> things being compared are refs, then “may”.
>>
>> On Aug 1, 2014, at 12:05 PM, Paul Govereau <paul.govereau at oracle.com>
>> wrote:
>>
>>> Sorry, I am a little confused. I sounds like Brian is saying that
>>> T=U _must_ be true, and Maurizio is saying we only need that
>>> T=U _may_ be true?
>>>
>>> Is this a case where value- and reference-types differ?
>>>
>>> Paul
>>>
>>>> On 08/01/2014 02:27 PM, Maurizio Cimadamore wrote:
>>>>
>>>>> On 01/08/14 11:23, Maurizio Cimadamore wrote:
>>>>> Right - I would expect that to already be working (modulo the fact
>>>>> that I have not really tested integration of 'any' with value types
>>>>> that much - yet).
>>>> Let me backtrack a bit - currently the spec (15.21.3) demands that the
>>>> equality should be accepted if one type is castable to the other. I
>>>> believe in all the examples I've seen so far, that's the case, as there
>>>> is always a chance that the type-variable will be instantiated with the
>>>> same type, so the cast must be allowed.
>>>>
>>>> Maurizio
>>>>>
>>>>> Maurizio
>>>>>
>>>>>> On 01/08/14 11:07, Brian Goetz wrote:
>>>>>> Certainly if we cannot prove T=U then I think this equality
>>>>>> comparison makes no sense. But if we have
>>>>>>
>>>>>> <any T> boolean foo(A<T> a, A<T> b) { return a==b; }
>>>>>>
>>>>>> this does make sense (assuming we are comparing values for state
>>>>>> equality via ==).
>>>>>>
>>>>>>
>>>>>> On Aug 1, 2014, at 10:10 AM, Paul Govereau <paul.govereau at oracle.com>
>>>>>> wrote:
>>>>>>
>>>>>>> The following code is valid for reference types:
>>>>>>>
>>>>>>> class A<T> {
>>>>>>> int x = 0;
>>>>>>>
>>>>>>> <T,U> boolean foo(A<T> a, A<U> b) {
>>>>>>> return (a == b);
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>> However, I don't think this makes sense for value types. In the case
>>>>>>> of reference types, the "top" is a realizable type, namely Object;
>>>>>>> but, for values the "top" is not realizable?
>>>>>>>
>>>>>>> final __ByValue class A<T> {
>>>>>>> final int x = 0;
>>>>>>>
>>>>>>> <any T, any U> boolean foo(A<T> a, A<U> b) {
>>>>>>> return (a == b); // <<--- type error ??
>>>>>>> }
>>>>>>> }
>>>>>>>
>>>>>>> Should this be a type error?
>>>>>>>
>>>>>>> Paul
>>
>>
More information about the valhalla-dev
mailing list