Если класс 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
обработке, хотя:
false
if obj
is 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 []