Submission: switch (...) instanceof feature

Jeroen van Maanen jeroen at lexau.org
Sun Mar 29 13:43:02 PDT 2009


Artur Biesiadowski wrote:
> 1) Why case void: instead of case null: ?

Yes, I agree that it is potentially confusing. At the other hand, null is an instance not a type. It would also be possible to add a type or even a keyword to describe the type of null, but that would increase the impact of the change and it would mean another type with no instances. I thought that void would pretty much fit the descrition of what I would like: a keyword that indicates a type that would not have any actual instances. I suppose that if we are stretching the exact meaning of the terms anyway, then 'case null:' would probably just be as well and easier to remember.

> 2) What is a expected behavior in case of multiple matches ? For example

I propose to do strict top-down first-match-only evaluation, because if the given variable matches many of the labels and the types of the labes belong to a complicated hierarchy of interfaces, then reordering the cases according to inheritance could lead to unpredictable results. I don't think that executing all matching blocks would be a good idea, because I think that many code readers would not expect this from a switch statement. Although it would be possible to allow a fallthrough from a specific type to a super type, I am afraid that allowing such highly constrained constructions would lead to code that is hard to read and easy to misunderstand.

> switch(collection) instanceof {
> 
> case RandomAccess:
>    ...
> 
> case List:
>   ...
> 
> case Collection:
>  ...
> 
> 
> }
> 
> Do I need to put switch cases in correct order because of top-to-down 
> evaluation or most specific one will be used? Or maybe all matching ones ?
> 
> 3) I think you have forgotten to put 'break' in your examples, unless 
> you plan to disallow fall-through.

Ah, I should have made that explicit. No breaks necessary and no lists of labels before a statement block. I could not think of a way to get the  casts right in a fallthrough situation. Maybe it would be less confusing to make break a compulsory statement at the end of each statement block. That is:

  TypeSwitchBlockStatementGroup:
    TypeSwitchLabel BlockStatements break ;

What do you think?

> Regards,
> Artur Biesiadowski

I just thought about another situation that needs to be clarified:

4) How does the switch instanceof statement handle generics?

I would like to see

switch (model) instanceof {
FreeMarkerModel:
  template.process(..., model);
Map:
  template.process(..., toFMM(model))
}

translated as

if (model instanceof FreeMarkerModel) {
  FreeMarkerModel model$1 = (FreeMarkerModel) model;
  template.process(..., model$1);
}
else if (model instanceof Map<?,?>) {
  Map<?,?> model$2 = (Map<?,?>) model;
  template.process(..., toFMM(model$2));
}

So each type parameter that we cannot guess would be specified as ?.

The following would be illegal, because the specification allows no type parameters after the type name in a label.

switch (model) instanceof {
...
Map<String,Object>:
...
}

This is fine, because I can't think of a way where the desugared code would be free of "unchecked" warnings.

Regards,  Jeroen



More information about the coin-dev mailing list