Equality
Brian Goetz
brian.goetz at oracle.com
Sat Dec 19 16:38:37 UTC 2015
> Anyfy equals, and adjust default implementation of boolean T.equals(any x)
I think we may be talking past each other (while basically saying the
same thing from opposite directions.)
"any" is not a type; it is a modifier that affects the domain of type
variables. So we don't have (and I think we don't want) a meaning for
equals(any x). But what we do want, is a way of expressing "I'll take
anything which could be on the other side of the == operator with me."
For refs, that's Object; for a value type V, that's just V.
Where we had gotten with the <V super U> / superation idiom (not
suggesting either of these syntaxes is great) is being able to express:
- If T is value, then T, else the erasure of T (usually object) **
I'll write this as Sup<T> for short. The convenient thing about Sup<T>
is that it conveniently collapses to Object in the places where we want
Object, so we could define contains/remove as
contains(Sup<T>)
and contains will always bottom out at equals(), so equals() similarly
needs to be
equals(Sup<Self>)
If this is a valid approach (and I think its the best one we've got so
far), then we're looking for how to spell Sup<Self> (in all of: type
system, language syntax, bytecode descriptors.)
> I still think that doing something like this removes the need
> to specially deal with Collection.contains and related methods.
I don't see it yet; those signatures are still currently
contains(Object), which isn't appropriate for value types. So we have
to do *something*.
** There's a lot of sloppiness in the ref/val distinction, which is
going to need to be cleaned up. Sometimes when we say ref/val, we mean
"erased/reified". Sometimes we mean "polymorphic/monomorphic".
Sometimes we mean "nullable/non-nullable."
More information about the valhalla-spec-experts
mailing list