instanceof
służy do określania typu obiektu podczas runtime. Próbujesz ustalić, czy x
jest naprawdę obiektem typu J
, gdy program jest uruchomiony, więc kompiluje.
Czy myślisz, że powinno to spowodować błąd podczas kompilacji, ponieważ uważasz, że kompilator nie zna typu x
?
Edit
Jak Kirk Woll skomentował (dzięki Kirk Woll!), Jeśli były sprawdzenie czy x
jest instanceof
konkretna klasa, a kompilator może określić x
„s typ, a następnie dostaniesz błąd podczas kompilacji.
Z języka Java Specification:
Jeżeli odlew RelationalExpression do ReferenceType zostanie odrzucony jako błąd kompilacji, a następnie wyrażenie relacyjne instanceof również produkuje błąd kompilacji. W takiej sytuacji wynik instancji wyrażenia nigdy nie byłby prawdziwy.
Jako przykład tego:
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
}
}
Nota boczna - proszę nie zapomnieć dodać znacznika dla języka. Dodałem "java" dla ciebie. – EboMike
Przepraszam, powinienem mieć – user439526