Consider the following:
void test(Object o) {
if (o instanceof Number || o instanceof String) {
o // typeof(o) is (Number | String)
}
}
If a non-instanceof clause is found, the type may also be the original expression type.
void test(Object o) {
if (o instanceof Number || something) {
o // typeof(o) is (Number | Object)
}
}
A similar situation exists for catch and switch.

Consider the following:
If a non-instanceof clause is found, the type may also be the original expression type.
A similar situation exists for
catchandswitch.