Jeśli klasa B
i klasa C
rozszerzają klasę, A
a ja mam obiekt typu B
lub C
, jak mogę ustalić, który typ jest instancją?
java
inheritance
nośnik
źródło
źródło
Odpowiedzi:
źródło
if(!(obj instanceof C))
code
= new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = new Child2 (); (child1 instanceof Parent1); (child1 instanceof Child1); (parentChild instanceof Child2); (parentChild instanceof Parent1); (parentChild instanceof Child1);code
, może wyczyścić zamiar instanceof.Użyj Object.getClass () . Zwraca typ środowiska wykonawczego obiektu.
źródło
Przedstawiono wiele poprawnych odpowiedzi, ale jest jeszcze więcej metod:
Class.isAssignableFrom()
i po prostu próba rzucenia obiektu (co może rzucić aClassCastException
).Możliwe sposoby podsumowane
Podsumujmy możliwe sposoby sprawdzenia, czy obiekt
obj
jest instancją typuC
:Różnice w
null
obsłudzeJest jednak różnica w
null
obsłudze:false
czyobj
jestnull
(null
nie jest instancją czegokolwiek).NullPointerException
oczywiście.null
ponieważnull
można je zastosować do dowolnego typu!Notatki
Class.getName()
nie powinien być używany do wykonywania testu „jest-wystąpieniem-z”, ponieważ jeśli obiekt nie jest typu,C
ale jego podklasą, może mieć zupełnie inną nazwę i pakiet (dlatego nazwy klas oczywiście nie będą pasować), ale jest nadal typuC
.Class.isAssignableFrom()
nie jest symetryczny :obj.getClass().isAssignableFrom(C.class)
zwróci,false
jeśli typobj
jest podklasąC
.źródło
Możesz użyć:
HTH. Ale myślę, że przez większość czasu nie jest dobrą praktyką stosowanie tego do kontroli przepływu lub coś podobnego ...
źródło
Każde użycie którejkolwiek z sugerowanych metod jest uważane za zapach kodu, który opiera się na złym projekcie OO.
Jeśli twój projekt jest dobry, nie powinieneś potrzebować używania
getClass()
lubinstanceof
.Każda z sugerowanych metod zadziała, ale tylko coś, o czym należy pamiętać, jeśli chodzi o projekt.
źródło
W tym przypadku możemy użyć refleksji
Przykład:-
W takim przypadku otrzymasz nazwę klasy, którą obiekt przekazuje do
HttpServletRequest
zmiennej odniesienia interfejsu.źródło
obj.getClass()
spowoduje zwrócenie nazwy klasy, przedrostek po słowieclass
request.getClass().getName();
drukuje wszystkie paczki! wraz z nazwą klasyIstnieje również
.isInstance
metodaClass
klasy „ ”. jeśli uzyskasz klasę obiektu przezmyBanana.getClass()
, możesz sprawdzić, czy twój obiektmyApple
jest instancją tej samej klasy, comyBanana
viaźródło
sprawdzanie za pomocą
isinstance()
nie wystarczy, jeśli chcesz wiedzieć w czasie wykonywania. posługiwać się:źródło
Używam funkcji blow w mojej klasie GeneralUtils, sprawdź, czy może być przydatna
źródło
Użyłem generycznych plików Java 8, aby uzyskać instancję obiektu w czasie wykonywania, zamiast konieczności używania wielkości liter
przekazać dowolny typ danych, a metoda wydrukuje typ danych przekazanych podczas ich wywoływania. na przykład
Poniżej znajduje się wynik
źródło