instanceof
используется для определения типа объекта во время выполнения.Вы пытаетесь определить, действительно ли x
является объектом типа J
во время работы программы, поэтому она компилируется.
Неужели вы думаете, что это должно привести к ошибке во время компиляции, потому что вы думаете, чтокомпилятор не знает тип x
?
Редактировать
Как прокомментировал Кирк Волл (спасибо Кирку Воллу!), проверяли ли вы x
это instanceof
конкретный класс, и компилятор может определить тип x
, тогда вы получите ошибку во время компиляции.
Из спецификации языка Java:
Если приведение выражения RelationalExpression к ReferenceType будет отклонено как ошибка времени компиляции, то реляционное выражение instanceof также вызывает ошибку времени компиляции.В такой ситуации результат выражения instanceof никогда не может быть истинным.
Как пример этого:
import java.io.Serializable;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
class SerializableClass implements Serializable
{
private writeObject(ObjectOutputStream out) {}
private readObject(ObjectInputStream in) {}
}
public class DerivedSerializableClass extends SerializableClass
{
public static void main(String[] args)
{
DerivedSerializableClass dsc = new DerivedSerializableClass();
if (dsc instanceof DerivedSerializableClass) {} // fine
if (dsc instanceof Serializable) {} // fine because check is done at runtime
if (dsc instanceof String) {} // error because compiler knows dsc has no derivation from String in the hierarchy
Object o = (Object)dsc;
if (o instanceof DerivedSerializableClass) {} // fine because you made it Object, so runtime determination is necessary
}
}