On 07/07/17 16:05, Dmitry Petrashko wrote:
Hi Maurizio,
thanks for a good writeup.
I’ll provide some perspective coming from Scala.
At the very beginning of your writeup you say:
In order to further simplify the discussion, let's also ignore var
patterns; in fact, a pattern such as var x can always be thought
of a type-test pattern where the type of the test is implicitly
inferred by the compiler using some target-type information. in
other words, given a target expression s whose static type is
String, the following two snippets should behave in the same fashion:
if (s matches String x) { ... }
if (s matches var x) { ... }
This is not the case in Scala.
|scala> (null: String) match {case a => true} // variable bound. Though
variable has type String it is null. res0: Boolean = true scala>
(null: String) match {case _: String => true} // type test. Null will
fail it. scala.MatchError: null |
Even if Java would decide to go towards the path you’ve described, It
would be nice to be able to accommodate
alternative behaviour that Scala has.
I understand. In our mind, 'var' is simply a way to tell the compiler
"type missing here, please fill it out" - and we'd like to keep the type
inference as orthogonal as possible from other related semantics.
In Scala, the runtime uses |instanceof| test (Option 1 in your writeup),
while the exhaustivity checkers uses type system and assumes absence
of null (Option 2).
For generics, we issue a warning that type parameters are unchecked.
Have you considered this option?
So, you are saying that Scala does option 1 - but it tones it a bit down
by emitting a warning (rather than an harsh error) when generic types
are found.
This seems a sensible option - the only thing I don't understand from
your description - what does Scala do for nested patterns? Is it another
instanceof? If that's the case, does it means that I cannot match
against a List whose head is null with a normal nested type test pattern?
Maurizio
Based on our experience it works well in practice, but it’s not clear
how applicable our experience
would be in Java.
Best regards,
Dmitry
On 7 Jul 2017, at 14:56, Maurizio Cimadamore wrote:
Hi,
over the last few weeks we've been exploring the twisted
relationship between patterns and nulls. This document:
http://cr.openjdk.java.net/~mcimadamore/nulls-patterns.html
<http://cr.openjdk.java.net/%7Emcimadamore/nulls-patterns.html>
provides some (hopefully helpful) insights into what the design
space looks like.
tl;dr;
Looks like trying to force the same rule on all patterns,
regardless of where they appear, leads to problems. Distinguishing
between toplevel and nested patterns provides a good basis to
handle null in a more predictable/flexible fashion.