Не для того, чтобы быть противным, но вы должны сказать компилятору, что вы хотите сделать, потому что альтернативой было бы угадать, что вы пытаетесь сделать.Конечно, вы можете подумать: «Если я проверяю тип объекта, Ясно, что это должно означать, что я хочу привести его к этому типу».А кто говорит?Может быть, это то, что вы делаете, и, возможно, это не так.
Конечно, в простом случае, как
if (x instanceof Integer)
{
Integer ix=(Integer) x;
...
Мои намерения довольно очевидны.Либо это?Возможно, я действительно хочу:
if (x instanceof Integer || x instanceof Double)
{
Number n=(Number) x;
... work with n ...
Или что, если я напишу:
if (x instanceof Integer || x instanceof String)
Что вы ожидаете от компилятора дальше?Какой тип он должен принимать для x?
RE - комментарии о том, что instanceof устарел или иным образом плохая идея: он, безусловно, может быть использован неправильно.Недавно я работал над программой, в которой первоначальный автор создал шесть классов, которые, как оказалось, были страницами и страницами длиной, но идентичны друг другу, и единственной очевидной причиной их наличия было то, что он мог сказать «x instanceof classA» против »x instanceof classB "и т. д. То есть он использовал класс в качестве флага типа.Было бы лучше иметь только один класс и добавить перечисление для различных типов.Но есть также много очень хороших применений.Возможно, наиболее очевидным является что-то вроде:
public MyClass
{
int foo;
String bar;
public boolean equals(Object othat)
{
if (!(othat instanceof MyClass))
return false;
MyClass that=(MyClass) othat;
return this.foo==that.foo && this.bar.equals(that.bar);
}
... etc ...
}
Как бы вы сделали это без использования instanceof?Вы можете сделать параметр типа MyClass вместо Object.Но тогда нельзя будет даже назвать его с помощью универсального объекта, что может быть весьма желательно во многих случаях.Действительно, может быть, я хочу, чтобы коллекция включала, скажем, и строки, и целые числа, и я хочу, чтобы сравнения разных типов просто возвращали false.