Если класс 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 = new Child2 (); Child2 child2 = new Child2 (); (child1 instanceof Parent1); (child1 instanceof Child1); (parentChild instanceof Child2); (parentChild instanceof Parent1); (parentChild instanceof Child1); code , это может очистить намерение instanceof.
Используйте Object.getClass () . Возвращает тип времени выполнения объекта.
Было представлено несколько правильных ответов, но есть еще несколько методов: Class.isAssignableFrom()и просто попытка привести объект (который может вызвать a 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обработке, хотя:
falseif objis null( nullне является экземпляром чего-либо).NullPointerExceptionочевидно.nullпотому что nullмогут быть приведены к любому типу!Помнить:
nullэто не экземпляр любого типа, но он может быть приведен к любому типу.
Class.getName()не должен использоваться для выполнения теста "is-instance-of", если объект не типа, 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
НТН. Но я думаю, что в большинстве случаев не рекомендуется использовать это для управления потоком данных или чего-то подобного ...
Любое использование любого из предложенных методов считается запахом кода, который основан на плохом дизайне ОО.
Если ваш дизайн хороший, вам не нужно использовать getClass()или instanceof.
Подойдет любой из предложенных методов, но только то, что нужно иметь в виду, с точки зрения дизайна.
Мы можем использовать отражение в этом случае
objectName.getClass().getName();
Пример:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
В этом случае вы получите имя класса, объект которого передается в HttpServletRequestинтерфейсную переменную.
obj.getClass()вернет className, prefixex по слову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 []