Finding the spirit of L-World
Brian Goetz
brian.goetz at oracle.com
Thu Feb 28 21:04:27 UTC 2019
> One way to fix that and other reflective artifacts, is to piggy-back
> on specialized generics and their refined type system. In the spirit
> of brainstorming, let's pull on that string a bit.
>
> We could declare that `RefObject` is a *species* of `Object`, not
> a subclass. Then, `Object` is revealed to be a template with just
> two species.
As I was writing, I knew that this was where you were going to go.
What that means is that we layer another requirement onto species; that
they be denotable with simple names. I am not sure we want to go there,
just for the sake of this one example?
> (The species parameter of `Object<hasIdentity>` could be `<true>`
> for `RefObject`, etc. …Shots fired! Look out, he's got a non-type in
> his parameter list! Or the species parameter could be a placeholder
> type of some sort.)
This is a sensible possible place to get to, but it means we give up the
pedagogical benefit of RefObject/ValObject being "just" Java classes.
If we can't write these in Java, that's a big loss; having to have
generics with non-type parameters on Day 1 does a lot of damage to the
delivery plan.
> Since templates aren't ready yet, this can't be a fully-baked proposal,
> but it could work in the long term. Maybe that suggests a short term
> approximation? Should we be talking about `Object<Ref>` and
> `Object<Val>` as injected species, rather than `RefObject` and
> `ValObject`? They would have conditional members, whatever that
> means. That also feels like an unnecessary complexity now, but
> it might be more appropriate in a world with templates.
Yeah, also, think about the first day of class. Everything is an
Object, they say. OK, fine, whatever an Object is. Now, some objects
are Object<Ref>, and some are Object<Val>, which are sub-species ....
WTF? This is putting a grad-school concept on the 3rd grade curriculum.
An alternate approach (which in general I don't love, but could be made
to work) is to make {Ref,Val}Object interfaces. I think its a weaker
semantic story, but maybe its viable. In that case, we could have a
(private) sub-species of Object that implements RefObject, and that's
what you'd get when you say "new Object()". Then .getClass() is
stable. But to do it for this reason seems like
flea-wagging-tail-wagging-dog.
The hybrid approach, which happens to work in this case, is have
RefObject be an interface and ValObject be a class. Again, I don't like
it as much as subclasses, but it's not outright unacceptable. It's a
little better on the implementation-perturbations and a bit worse on the
providing-a-sensible-user-model side.
More information about the valhalla-spec-observers
mailing list