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ą?
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ą?
Odpowiedzi:
if (obj instanceof C) {
//your code
}
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.
Przedstawiono wiele poprawnych odpowiedzi, ale jest jeszcze więcej metod: Class.isAssignableFrom()
i po prostu próba rzucenia obiektu (co może rzucić a ClassCastException
).
Podsumujmy możliwe sposoby sprawdzenia, czy obiekt obj
jest instancją typu C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
obsłudzeJest jednak różnica w null
obsłudze:
false
czy obj
jest null
( null
nie jest instancją czegokolwiek).NullPointerException
oczywiście.null
ponieważ null
można je zastosować do dowolnego typu!Pamiętaj:
null
nie jest instancją żadnego typu, ale można ją rzutować na dowolny typ.
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 typu C
.Class.isAssignableFrom()
nie jest symetryczny : obj.getClass().isAssignableFrom(C.class)
zwróci, false
jeśli typ obj
jest podklasą C
.Możesz użyć:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Ale myślę, że przez większość czasu nie jest dobrą praktyką stosowanie tego do kontroli przepływu lub coś podobnego ...
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()
lub instanceof
.
Każda z sugerowanych metod zadziała, ale tylko coś, o czym należy pamiętać, jeśli chodzi o projekt.
W tym przypadku możemy użyć refleksji
objectName.getClass().getName();
Przykład:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
W takim przypadku otrzymasz nazwę klasy, którą obiekt przekazuje do HttpServletRequest
zmiennej odniesienia interfejsu.
obj.getClass()
spowoduje zwrócenie nazwy klasy, przedrostek po słowieclass
request.getClass().getName();
drukuje wszystkie paczki! wraz z nazwą klasy
Istnieje również .isInstance
metoda Class
klasy „ ”. jeśli uzyskasz klasę obiektu przez myBanana.getClass()
, możesz sprawdzić, czy twój obiekt myApple
jest instancją tej samej klasy, co myBanana
via
myBanana.getClass().isInstance(myApple)
sprawdzanie za pomocą isinstance()
nie wystarczy, jeśli chcesz wiedzieć w czasie wykonywania. posługiwać się:
if(someObject.getClass().equals(C.class){
// do something
}
Używam funkcji blow w mojej klasie GeneralUtils, sprawdź, czy może być przydatna
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
Użyłem generycznych plików Java 8, aby uzyskać instancję obiektu w czasie wykonywania, zamiast konieczności używania wielkości liter
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
przekazać dowolny typ danych, a metoda wydrukuje typ danych przekazanych podczas ich wywoływania. na przykład
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
Poniżej znajduje się wynik
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []