Do czego służy instanceof
operator? Widziałem takie rzeczy
if (source instanceof Button) {
//...
} else {
//...
}
Ale nic z tego nie miało dla mnie sensu. Zrobiłem swoje badania, ale wymyśliłem tylko przykłady bez żadnych wyjaśnień.
java
instanceof
Ben
źródło
źródło
instanceof
gdy nadrzędneequals
?Odpowiedzi:
instanceof
słowo kluczowe jest operatorem binarnym używanym do testowania, czy obiekt (instancja) jest podtypem danego Type.Wyobrażać sobie:
Wyobraź sobie
dog
obiekt utworzony za pomocąObject dog = new Dog()
:Jednakże, z
Object animal = new Animal();
,ponieważ
Animal
jest nadtypemDog
i prawdopodobnie mniej „wyrafinowanym”.I,
Dzieje się tak, ponieważ
Dog
nie jest on ani podtypem, ani nadtypemCat
, a także go nie implementuje.Zauważ, że zmienna użyta
dog
powyżej jest typuObject
. Ma to na celu pokazanie, żeinstanceof
jest to operacja w czasie wykonywania i prowadzi nas do przypadku użycia: aby reagować inaczej w zależności od typu obiektów w czasie wykonywania .Uwaga:
expressionThatIsNull instanceof T
jest fałszywa dla wszystkich typówT
.Miłego kodowania.
źródło
Object dog = new Dog(); System.out.println(dog instanceof Cat);
. Kompiluje się dobrze i drukujefalse
. Kompilator nie może określić w czasie kompilacji, którydog
nie może być Cat (zgodnie z regułami w JLS)boolean b = "foo" instanceof Integer;
Object indirect = ...; if (indirect instanceof Something)
. Nie chodzi o to,if (literal instanceof Something)
jak wydajesz się zakładać.Object dog
część. Mój błąd!dog instanceof Cat // does not even compile!
(bo to jest klasa). GdybyCat
był interfejs, to by się skompilował.Jest to operator, który zwraca prawdę, jeśli lewa strona wyrażenia jest instancją nazwy klasy po prawej stronie.
Pomyśl o tym w ten sposób. Powiedzmy, że wszystkie domy w twoim bloku zostały zbudowane z tych samych planów. Dziesięć domów (obiektów), jeden zestaw planów (definicja klasy).
instanceof
to przydatne narzędzie, gdy masz kolekcję obiektów i nie jesteś pewien, czym one są. Załóżmy, że masz zbiór kontrolek w formularzu. Chcesz odczytać stan zaznaczenia wszystkich pól wyboru, ale nie możesz poprosić zwykłego starego obiektu o stan zaznaczenia. Zamiast tego zobaczysz, czy każdy obiekt jest polem wyboru, a jeśli tak, przerzuć go na pole wyboru i sprawdź jego właściwości.źródło
instanceof
może uczynić go bezpiecznym do przygnębienia.Jak opisano na tej stronie :
Mam nadzieję, że to pomoże!
źródło
Ten operator umożliwia określenie typu obiektu. Zwraca a
boolean
wartość.Na przykład
wynik to:
źródło
Jeśli
source
jestobject
zmienną,instanceof
to sposób na sprawdzenie, czy jest to zmienna,Button
czy nie.źródło
Jak wspomniano w innych odpowiedziach, typowym kanonicznym zastosowaniem
instanceof
jest sprawdzenie, czy identyfikator odnosi się do bardziej konkretnego typu. Przykład:Zwróć jednak uwagę, że typ wyrażenia po lewej stronie musi być rodzicielem wyrażenia po prawej stronie (patrz JLS 15.20.2 i Java Puzzlers, # 50, str . 114 ). Na przykład następujące elementy nie zostaną skompilowane:
Nie można skompilować się z komunikatem:
Jak
Test
nie jest klasą nadrzędnąString
. OTOH, to doskonale się kompiluje i drukujefalse
zgodnie z oczekiwaniami:źródło
źródło
Może być używany jako skrót przy sprawdzaniu równości.
źródło
Większość ludzi poprawnie wyjaśniła „co” w tym pytaniu, ale nikt nie wyjaśnił poprawnie „jak”.
Oto prosta ilustracja:
Wyjścia:
Powód błędu kompilatora podczas porównywania
s
z StringBuffer jest dobrze wyjaśniony w dokumentacji :co oznacza, że LHS musi być instancją RHS lub klasy, która albo implementuje RHS, albo rozszerza RHS.
Jak w takim razie korzystać z instanceof?
Ponieważ każda klasa rozszerza Object, rzutowanie typów LHS na obiekt zawsze będzie działać na twoją korzyść:
Wyjścia:
źródło
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true
, skoro tworzymy s do Object?http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
źródło
Wystąpienie słowa kluczowego jest pomocne, gdy chcesz poznać instancję konkretnego obiektu.
Załóżmy, że rzucasz wyjątek, a gdy masz catch, wykonaj sumaryczną operację niestandardową, a następnie ponownie kontynuuj zgodnie z logiką (rzuty lub dziennik itp.)
Przykład: 1) Utworzony przez użytkownika wyjątek niestandardowy „InvalidExtensionsException” i zgłoś go zgodnie z logiką
2) Teraz w catch block catch (Exception e) {wykonaj logikę sumy, jeśli typ wyjątku to „InvalidExtensionsException”
3) Jeśli nie sprawdzasz wystąpienia i typem wyjątku jest wyjątek wskaźnika Null, kod nie działa.
Więc twoja logika powinna znajdować się wewnątrz instancji if (e instanceof InvalidExtensionsException) {InvalidExtensionsException InvalidException = (InvalidExtensionsException) e; }
Powyższy przykład to zła praktyka kodowania Jednak ten przykład pomoże ci zrozumieć użycie jego wystąpienia.
źródło
Najlepsze wyjaśnienie to jls . Zawsze staraj się sprawdzić, co mówi źródło. Tam uzyskasz najlepszą odpowiedź i wiele więcej. Powielanie niektórych części tutaj:
źródło
Plik java
instanceof
Operator służy do testowania, czy obiekt jest instancją określonego typu (klasa, podklasa lub interfejs).Instancja w Javie jest również nazywana typem,
comparison operator
ponieważ porównuje instancję z typem. Zwraca albotrue
lubfalse
. Jeśli zastosujemyinstanceof
operator do dowolnej zmiennej, która manull
wartość, zwracafalse
.Z JDK 14+, który zawiera JEP 305 , możemy również wykonać „Pattern Matching” dla
instanceof
Wzorce zasadniczo sprawdzają, czy wartość ma określony typ, i mogą wyodrębniać informacje z wartości, gdy ma ona pasujący typ. Dopasowanie wzorców pozwala na bardziej przejrzyste i wydajniejsze wyrażenie wspólnej logiki w systemie, a mianowicie warunkowe usuwanie komponentów z obiektów.
Przed wersją Java 14
Ulepszenia Java 14
Możemy również łączyć ze sobą kontrolę typu i inne warunki
Użycie dopasowania wzorców w programie
instanceof
powinno zmniejszyć całkowitą liczbę rzutów jawnych w programach Java.PS :
instanceOf
będzie pasować tylko wtedy, gdy obiekt nie jest pusty, wtedy tylko można go przypisaćstr
.źródło
źródło
Bardzo prosty przykład kodu:
Uważaj tutaj. W powyższym przykładzie, jeśli Class1 to Object, pierwsze porównanie zawsze będzie prawdziwe. Tak więc, podobnie jak w przypadku wyjątków, liczy się hierarchia!
źródło
Możesz użyć Map, aby uzyskać wyższą abstrakcję na wystąpieniu
Następnie mając taką mapę dodaj do niej jakąś akcję:
Następnie mając obiekt nieznanego typu, możesz uzyskać określone działanie z tej mapy:
źródło
Operator instanceof służy do sprawdzania, czy obiekt jest instancją określonego typu. (klasa, podklasa lub interfejs).
Instancja instanceof jest również znana jako operator porównania typów, ponieważ porównuje instancję z typem. Zwraca prawdę lub fałsz.
Jeśli zastosujemy operator instanceof z dowolną zmienną, która ma wartość null, zwraca false.
źródło