What I mean is that if I have a method
void m(Integer x) { }
and I call m(1), then today we do an boxing conversion because
boxing is one of the conversions we do in method invocation
context. If we want to interpret this as a pattern match, we
should get the same answer, which means we need to define what
conversions we apply to the parameter when the parameter pattern
has a certain target type, and that has to align with existing
invocation context conversions.
What is not clear to me is are you proposing those conversion to be
applied on the target type of the pattern or even on the target type
of the sub patterns.
The sub-patterns don't enter into it. Because a pattern in this context
must be total on the type of the parameter/assignee, if it is a pattern
with sub-patterns, they must be total too, otherwise the whole thing is
not total.
If I have
Point(var x && x == 0, var y) = aPoint
I'm going to get an error that says that the pattern on the LHS is not
total on the target type of the thing on the RHS, which is Point.
But perhaps it's a more general question for the deconstruction
pattern, if we do not use 'var'
case Point(Type1 x, Type2 y): ...
what are the possible types for Type1 and Type2 given that Point is
declared as Point(DeclaredType1 x, DeclaredType2 y).
Do Type1 has to be DeclaredType1 (resp. Type2 == DeclaredType2) or do
some conversions are allowed ?
Go back to the previous point: the pattern must be total, so
deconstructor sub-patterns must be total on the type of the
deconstructor bindings.
I think you're asking something like: if we have deconstructor `Foo(int
x)`, can I invoke it with `Foo(Integer x)`? In other words, is there a
set of _pattern conversions_ where we are willing to make up the
difference between two similar-enough patterns, and call it total? I
have resisted this so far, because I think there are ample other ways to
get to what you want without the complexity of JLS Ch5. But I'll make a
note to come back with a more detailed explanation of the problem here.
This lead to another question, should we consider using a Pattern
declared inside a method declaration only as syntactic sugar or should
the notation reflected in an attribute of the method accessible by
reflection ?
Definitely sugar. Suppose we have a pattern P with target type T:
void m(P x) {
M
}
is equivalent to
void m(T x) {
P = x;
M
}
That said, its possible that _Javadoc_ might want to do more. Since
total patterns can still have remainder, its reasonable for the Javadoc
to capture this. But reflection is about what's in the classfile, not
the language model, so this is 100% not reflection's business.
It's an alternative syntax to the deconstruction pattern, usual
deconstruction pattern is
Type(pattern1, pattern2, ...)
The alternative syntax is
(pattern1, pattern2, ...)
and the type is found by type inference.
OK, as long as we're clear that this "alternate syntax" just in your
head. (See also: https://en.wikipedia.org/wiki/Alternative_facts).