Jeśli klasa Bi klasa Crozszerzają klasę, Aa ja mam obiekt typu Blub C, jak mogę ustalić, który typ jest instancją?
Jeśli klasa Bi klasa Crozszerzają klasę, Aa ja mam obiekt typu Blub 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 objjest 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) {
}
nullobsłudzeJest jednak różnica w nullobsłudze:
falseczy objjest null( nullnie jest instancją czegokolwiek).NullPointerExceptionoczywiście.nullponieważ nullmożna je zastosować do dowolnego typu!Pamiętaj:
nullnie 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, Cale 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, falsejeśli typ objjest 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 HttpServletRequestzmiennej 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ż .isInstancemetoda Classklasy „ ”. jeśli uzyskasz klasę obiektu przez myBanana.getClass(), możesz sprawdzić, czy twój obiekt myApplejest instancją tej samej klasy, co myBananavia
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 []