Why does AS tell me that `(ob instanceof Button)` is always `false`?
Why does AS tell me (ob instanceof Button)
always false
?
He also gives a "hint" 'Cast to Button'
. If I take a hint, nothing changes.
void setTextSizeForField(int textSize, Object ... obs){
for(Object ob: obs)
if (ob instanceof EditText) ((EditText) ob).setTextSize ( textSize );
else if (ob instanceof TextView) ((TextView) ob).setTextSize ( textSize );
else if (ob instanceof Button) ((Button) ob).setTextSize ( textSize/10 );
}
All message text:
Condition 'ob instanceof Button' is always 'false' less... (Ctrl+F1)
This inspection analyzes method control and data flow to report possible conditions that are
always true or false, expressions whose value is statically proven to be constant, and
situations that can lead to nullability contract violations.
Variables, method parameters and return values marked as @Nullable or @NotNull are
treated as nullable (or not-null, respectively) and used during the analysis to check
nullability contracts, e.g. report possible NullPointerException errors.
More complex contracts can be defined using @Contract annotation, for example:
@Contract("_, null -> null") — method returns null if its second argument is null
@Contract("_, null -> null; _, !null -> !null") — method returns null if
its second argument is null and not-null otherwise
@Contract("true -> fail") — a typical assertFalse method which throws an
exception if true is passed to it
The inspection can be configured to use custom @Nullable
@NotNull annotations (by default the ones from annotations.jar will be used)
I am not using annotations.
* EDIT *
If I change two statements else if
, I get no warnings and the code works fine.
So, I think "never mind" might be ok, but what do you think AS is doing?
source to share
The documentation shows that Button
extends TextView
, so the branch will never get executed. If you invert your checks for Button
and TextView
, then different paths will be executed.
source to share