Якщо клас Bі клас Cрозширюють клас, Aі у мене є об'єкт типу Bабо C, як я можу визначити, для якого типу це екземпляр?
Якщо клас Bі клас Cрозширюють клас, Aі у мене є об'єкт типу Bабо C, як я можу визначити, для якого типу це екземпляр?
Відповіді:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code Child1 child1 = new Child1 (); Parent1 parentChild = новий Child2 (); Child2 child2 = новий Child2 (); (child1 instanceof Parent1); (child1 instanceof Child1); (parentChild instanceof Child2); (parentChild instanceof Parent1); (parentChild instanceof Child1); code , це може очистити наміри instanceof.
Використовуйте Object.getClass () . Він повертає тип виконання об'єкта.
Було представлено кілька правильних відповідей, але є ще методи: Class.isAssignableFrom()і спроба кинути об'єкт (що може кинути а ClassCastException).
Давайте підведемо підсумки можливих способів перевірити, чи об’єкт objє екземпляром типу 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поводженніІснує різниця в nullповодженні, хоча:
falseякщо objє null( nullне є примірником нічого).NullPointerExceptionочевидно.nullтому що nullможуть бути передані будь-якому типу!Пам'ятайте:
nullце не примірник будь-якого типу, але його можна передавати будь-якому типу.
Class.getName()не повинен використовуватися для виконання тестового вікна "є екземпляр", якщо об'єкт не типу, Cа його підкласу, він може мати зовсім інше ім'я та пакет (тому імена класів, очевидно, не збігаються), але це все ще типу C.Class.isAssignableFrom()не симетрична : obj.getClass().isAssignableFrom(C.class)повертається, falseякщо тип objє підкласом C.Ви можете використовувати:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Але я думаю, що в більшості випадків це не належна практика використовувати це для контролю потоку або щось подібне ...
Будь-яке використання будь-якого із запропонованих методів вважається кодовим запахом, який базується на поганому дизайні ОО.
Якщо ваш дизайн хороший, ви не повинні вважати себе необхідним використовувати getClass()або instanceof.
Будь-який із запропонованих методів буде зроблений, але лише щось, про що слід пам’ятати, розробити дизайн.
Ми можемо використовувати рефлексію в цьому випадку
objectName.getClass().getName();
Приклад: -
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
У цьому випадку ви отримаєте ім'я класу, який об'єкт переходить до HttpServletRequestзмінної інтерфейсу.
obj.getClass()поверне класName, префікс словомclass
request.getClass().getName();роздруковує весь пакет! разом із назвою класу
Існує також .isInstanceметод Classкласу " ". якщо ви отримуєте клас об'єкта через, myBanana.getClass()ви можете побачити, чи ваш об'єкт myAppleє екземпляром того ж класу, що і myBananaчерез
myBanana.getClass().isInstance(myApple)
перевірка з isinstance()не буде достатньо, якщо ви хочете дізнатися про час виконання. використання:
if(someObject.getClass().equals(C.class){
// do something
}
Я використовую функцію дуття у своєму класі GeneralUtils, перевірте, чи це може бути корисно
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
Я використовував дженерики Java 8, щоб отримати те, що є об’єктом об'єкта під час виконання, а не використовувати корпус комутатора
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
передайте будь-який тип даних і метод надрукує тип даних, які ви передали під час виклику. напр
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);
Далі йде вихід
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 []