Type equality for values

Alex Meiburg timeroot.alex at gmail.com
Fri Aug 1 23:16:23 UTC 2014


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