Type equality for values

Brian Goetz brian.goetz at oracle.com
Fri Aug 1 20:54:46 UTC 2014


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