Amber features 2026
Brian Goetz
brian.goetz at oracle.com
Wed Jan 14 02:33:12 UTC 2026
While I totally understand why you would want to do that, I don't see
the connection between pattern assignment and extending the type system
to permit denotation of quantified or existential types? I don't see
any patterns in your example, only type manipulation.
What you're saying is that you'd like a conversion from Foo<?> to
`\exist T .
Foo<T>`. This is understandable, as wildcards are basically
existentials already, and is just as safe as the the trick of calling an
out-of-line generic method.
But I just don't see the connection with pattern assignment? It seems
like what you really want is "generic variables", to go along with
generic methods and classes?
On 1/13/2026 5:56 PM, Archie Cobbs wrote:
> [ This is in reply to
> https://mail.openjdk.org/pipermail/amber-spec-experts/2026-January/004306.html
> on amber-spec-experts. ]
>
> Hi Gavin,
>
> The "Pattern Assignment" and "Constant Patterns" ideas sound good to
> me. The "Pattern Assignment" idea is a natural way to extend pattern
> matching, which is motivated by the frequent need to declare variables
> to access the "variable components" in an instance of some object type.
>
> My question is: Wouldn't the same motivation apply to generic type
> parameters as well?
>
> Here's a trivial example. Suppose we have this class:
>
> public record Property<T>(T value) {
> boolean has(T t) {
> return t == value;
> }
> }
>
> and we want to write a method to check that a list of Property's are
> well-behaved.
>
> Here's what we'd LIKE to do, which is use "Pattern Assignment" for the
> generic type variable:
>
> public void verifyHas(List<Property<?>> properties) {
> for (Property<?> element : properties) {
> <T> Property<T> property = element;
> T value = property.value();
> assert property.has(value); // no cast needed here!
> }
> }
>
> but here's what we HAVE to do today to avoid the unchecked cast:
>
> public void verifyHas(List<Property<?>> properties) {
> for (Property<?> property : properties) {
> verifyHas(property);
> }
> }
>
> // Ugh. This method exists solely to declare <T> so we can avoid
> an unchecked cast
> private <T> void verifyHas(Property<T> property) {
> T value = property.value();
> assert property.has(value);
> }
>
> If we're going to add "Pattern Assignment" it seems like it would be
> reasonable for generic type variables to also benefit.
>
> Cheers,
> -Archie
>
> --
> Archie L. Cobbs
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20260113/629ccb47/attachment-0001.htm>
More information about the amber-dev
mailing list