instanceof operatorius skirtas patikrinti, ar tam tikras nuorodos (
reference) tipo kintamasis saugo reikšmę į vieno ar kito tipo objektą (tikrinamas IS-A ryšys). Pavyzdžiui:
Object o = new ArrayList(); // sukuriamas naujas objektas
boolean isList = o instanceof List; // reikšmė TRUE
boolean isArrayList = o instanceof ArrayList; // reikšmė TRUE
boolean isLinkedList = o instanceof LinkedList; // reikšmė FALSE
boolean isString = o instanceof String; // reikšmė FALSE
boolean isRunnable = o instanceof Runnable; // reikšmė FALSE
boolean isSerializable = o instanceof Serializable; // reikšmė TRUE
Aukščiau pateiktame pavyzdyje
o yra apibrėžtas kaip
Object tipo kintamasis, todėl kompiliatorius kintamojo
o tikrinimui netaiko jokių ribojimų: galima lyginti su visais klasių hierarchijoje esančiais tipais. Jei kintamasis
o būtų apibrėžtas kaip
List tipo nuoroda, kompiliavimo metu kiltų klaidos eilutėse 5, 7. Kompiliavimo metu kompiliatorius patikrina, ar tikrinamasis kintamasis ir taikomasis tipas priklauso tai pačiai objektų hierarchijos šakai.
Kadangi tipas Object yra "pačiame viršuje", šio tipo kintamuosius galima lyginti su bet kokiais
klasių,
interfeisų,
masyvų ir
Enum tipais (išskyrus anonimines klases, nes šių tipo tiesiogiai referuoti negalima).
Lyginimas su klasėmis nesudėtingas -- formatas
Serializable s = new Integer(123456);
boolean isInteger = s instanceof Integer;
Norint patikrinti, ar kintamasis rodo į masyvo tipo objektą, naudojama tokia sintaksė:
Object a = new int[10]; // masyvai yra objektai!
boolean isIntArray = a instanceof int[]; // TRUE
boolean isIntegerArray = a instanceof Integer[]; // FALSE
Čia svarbu "momentas": masyvai gali būti polimorfiški. T.y. masyvo iš
k tipo elementų kintamajam galima priskirti visus masyvus iš
m tipo elementų, kai
m tenkina "IS-A" (
yra) ryšį
k tipo atžvilgiu. Pavyzdžiai:
Number [] ni = new Integer[10]; // legalus priskyrimas, nes Integer paveldi iš Number
boolean isIntegerArray = ni instanceof Integer[]; // TRUE
boolean isNumberArray = ni instanceof Number[]; // TRUE
boolean isObjectArray = ni instanceof Object[]; // TRUE
boolean isLongArray = ni instanceof Long[]; // FALSE -- Integer nėra bendroje šakoje su Long
boolean isStringArray = ni instanceof String[]; // kompiliavimo klaida, nes String nėra bendroje hierarchijos šakoje su Number, todėl kompiliatorius šią situaciją sugeba aptikti