Якщо клас 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 []