JEP update: Classes for the Basic Primitives
Brian Goetz
brian.goetz at oracle.com
Thu Feb 10 12:24:50 UTC 2022
> * Could the doc make a clearer distinction (throughout) between which
> facts about int/Integer are happening because we expect *all* bucket-3
> classes to work that way, vs. which are special one-off tweaks for the
> 8 predefined types?
A "how are int/Integer special" section would indeed be useful. And I
think we haven't finished enumerating what goes in it; in the
discussions over inference, for example, several folks have been heard
mumbling "maybe we're trying to push the int/Integer analogy too far."
> * I'm curious whether it would be /possible/ to make `int` no longer a
> keyword, just a special kind of type alias that normal people don't
> get to declare. I'm /not/ claiming that'd be worth actually doing;
> just wanting to understand what forces would act to prevent it, as
> part of understanding everything that makes the 8 builtin types
> "irredeemably special".
In a previous world, `int` could have been an alias for `Integer.val`.
But we (happily) have banished .val from the world.
I think this is a useful exercise anyway, though; we have stumbled over
type-vs-class in a lot of places already with respect to B3, and int has
similar problems; most uses of `int` are types, but there's also
`int.class`, which means ... something. What exactly? And how does that
differ from Point.class / Point.ref.class /
Point.class.noNotThatClassTheOtherClass() ?
> * I assume the reason "the JVM type Qjava/lang/Double cannot be
> encoded with a Class object" is because the distinction between it and
> D is intentional implementation detail.
Worse :( The J and D carriers use two slots, so even if we wanted to
abstract over the primitive carriers, this is kind of a dead end. The
java/lang/Double class allows us to encode List<double> with a class
that carries a double but fits in one slot.
> * Since I think/hope it is /not/ true that `int` will be a subtype of
> `Integer`, it's not 100% clear whether the phrase "array covariance"
> in the doc is referring to the (desirable) property that `int[] <:
> Integer[]`. I think it is.
int will not be a subtype of Integer, nor will Point be a subtype of
Point.ref. (It was this way in a previous iteration; the VM still
believes the latter, but we're probably going to disabuse it of same.)
Traditional array covariance is tied to subtyping:
T <: U
---------- T-Cov
T[] <: U[]
But, we're going to modify this rule somewhat. We define a relation
between types, called "extends".
A extends B = A <: B if A is a reference type
A.ref <: B otherwise
(We could write this more concisely as "A extends B == A.ref <: B",
since the .ref operator is idempotent.) We use "extends" for things
like bounds conformance; if we have Foo<T extends Comparable>, we treat
Foo<int> as being in bounds.
So our modified covariance is:
T extends U
-------------- T-Cov-Ext
T[] <: U[]
which gives us int[] <: Integer[], even though we don't have int <:
Integer.
This is no mere flourish; without it, erased generics don't work:
class Box<T> {
T value();
T[] asArray();
}
This erases to returning Object[], and if we want to specialize
Box<int>, asArray() should return int[], but to be compatible with
erasure, we need int[] <: Object[].
> * I said in the meeting that "I don't think anyone cares" what kind of
> exception gets thrown if trying to store null in an `Integer[]` which
> is secretly an `int[]`. Well, I'm sure that's not at all true. :-) Sorry.
You're lucky they didn't show you their scars.
> * Re: "a basic primitive class may declare an instance field of its
> own primitive" -- does it really need that field, or can we nuke it
> and just s/value/this/g throughout the file? If that could work, it
> would be so much less confusing -- nothing circular! The only magic
> would be "where are the actual bits??" but you don't see the bits of
> an object header in `Object.java` either and the number of people this
> bothers is a very round number.
Seems plausible :)
More information about the valhalla-spec-observers
mailing list