Если класс B
и класс C
расширяют класс, A
и у меня есть объект типа B
или C
, как я могу определить, к какому типу он относится?
java
inheritance
перевозчик
источник
источник
Ответы:
источник
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()
и просто попытка привести объект (который может вызвать aClassCastException
).Возможные пути обобщены
Давайте суммируем возможные способы проверить, является ли объект
obj
экземпляром типаC
:Отличия в
null
обработкеЕсть разница в
null
обработке, хотя:false
ifobj
isnull
(null
не является экземпляром чего-либо).NullPointerException
очевидно.null
потому чтоnull
могут быть приведены к любому типу!Ноты
Class.getName()
не должен использоваться для выполнения теста "is-instance-of", если объект не типа,C
а подкласса, он может иметь совершенно другое имя и пакет (поэтому имена классов, очевидно, не будут совпадать), но это все еще типаC
.Class.isAssignableFrom()
не является симметричным :obj.getClass().isAssignableFrom(C.class)
будет возвращать,false
если типobj
является подклассомC
.источник
Ты можешь использовать:
НТН. Но я думаю, что в большинстве случаев не рекомендуется использовать это для управления потоком данных или чего-то подобного ...
источник
Любое использование любого из предложенных методов считается запахом кода, который основан на плохом дизайне ОО.
Если ваш дизайн хороший, вам не нужно использовать
getClass()
илиinstanceof
.Подойдет любой из предложенных методов, но только то, что нужно иметь в виду, с точки зрения дизайна.
источник
Мы можем использовать отражение в этом случае
Пример:-
В этом случае вы получите имя класса, объект которого передается в
HttpServletRequest
интерфейсную переменную.источник
obj.getClass()
вернет className, prefixex по словуclass
request.getClass().getName();
печатает всю упаковку! вместе с именем классаСуществует также
.isInstance
методClass
класса " ". если вы получаете класс объекта через,myBanana.getClass()
вы можете увидеть, является ли ваш объектmyApple
экземпляром того же класса, что иmyBanana
черезисточник
Проверка с помощью
isinstance()
будет недостаточно, если вы хотите знать во время выполнения. использовать:источник
Я использую функцию удара в своем классе GeneralUtils, проверьте, может быть полезно
источник
Я использовал дженерики Java 8, чтобы получить экземпляр объекта во время выполнения, а не использовать регистр
Передайте любой тип данных, и метод напечатает тип данных, которые вы передали при его вызове. например
Ниже приведен вывод
источник