----- Mail original -----
> De: "Brian Goetz" <brian.go...@oracle.com>
> À: "Tagir Valeev" <amae...@gmail.com>
> Cc: "amber-spec-experts" <amber-spec-experts@openjdk.java.net>
> Envoyé: Mardi 2 Mars 2021 18:44:27
> Objet: Re: [External] : Pattern assignment statements (extracted from: 
> Primitive type patterns and conversions)

>> A couple of other things to consider:
>> 1. C-style array declaration is not allowed in patterns.
> 
> Wish we could phase out C-style array decls entirely...
> 
>> 2. For local variable declaration, the initializer can omit `new int[]` part:
>> int data[] = {1, 2, 3}
> 
> Good catch.  For some reason I was thinking this was only for fields,
> but it works for locals too.  There's a future story about collection
> literals, but it is unlikely we'll be able to retcon exactly this
> syntax.  (#include "bikeshed-deterrent.h")

the whole story about initializing a local variable with an array is weird,
  int data[] = {1, 2, 3};
compiles but
  int data[];
  data = {1, 2, 3};
does not.

> 
> We may be able to address this by including a conversion from an array
> initializer to the target type of a pattern in an unconditional pattern
> assignment context.

while if think we have specify inference that uses the target type in order to 
avoid to avoid type patterns with a lot of redundant type information,
i'm not sure emulating that particular quirk of Java is a good idea. 

> 
>> 3. Local variable type may affect the initializer type (e.g.
>> List<String> list = List.of()). What about patterns? Can we say that a
>> `List<String> list` pattern is a total pattern over `List.of()`
>> expression type?
> 
> Yes, patterns have a notion of a target type, which is the type they
> have declared as their matchee.  For a type pattern `T t`, that target
> type is T.  We already evaluate whether the pattern is applicable to the
> matchee using this type.

yes, but we have to be careful here, as i said earlier, the inference you want 
when you do an instanceof/cast and the inference we already have can be at odd.
By example, with
  Object o;
  if (o instanceof List<> list) { .... }
inferring List<Object> has the current inference algorithm does will lead to a 
compile error.

Does it means we have two kind of inference algorithms ? In that case, how it 
works when they interact with each other (when i have a switch inside a lambda 
by example) ?
And in that case, what is the inference algorithm used in pattern assignment 
statements ?

At that point, my head explode :)

Rémi

 

Reply via email to