2012-01-01 4 views
38

Можно создать дубликат:
Java isInstance vs instanceOf operatorКогда использовать Class.isInstance() и когда использовать оператор instanceof?

Когда использовать Class.isInstance() и когда использовать instanceof оператор?

Java предоставляет два варианта проверки совместимости назначений. Что использовать, когда?

+5

Если вы собираетесь закрыть вопрос как дубликат, по крайней мере, цитируйте более ранние вопросы. – user949300

ответ

45

Я думаю, что официальный documentation дает ответ на этот (хотя и в довольно неспецифической образом):

Этот метод является динамический эквивалент языка Java InstanceOf оператора.

Я предполагаю, что isInstance() предназначен, прежде всего, для использования в коде, касающемся отражения типа во время выполнения. В частности, я бы сказал, что он существует для обработки случаев, когда вы, возможно, заранее не знаете тип (ы) класса (ов), который вы хотите проверить на членство заранее (редко, хотя эти случаи, вероятно, есть).

Например, вы можете использовать его, чтобы написать метод, который проверяет, если две произвольно набранные объекты присвоения совместимы, как:

public boolean areObjectsAssignable(Object left, Object right) { 
    return left.getClass().isInstance(right); 
} 

В общем, я бы сказал, что использование instanceof должно быть если вы знаете, какой класс вы хотите проверить заранее. В тех редких случаях, когда вы этого не сделаете, используйте вместо этого isInstance().

+6

Другим типичным прецедентом для метода isInstance является использование дженериков. Существует множество ситуаций, когда у вас есть объект 'Class ', и единственный способ проверить, принадлежит ли этот объект этому классу, - это метод 'isInstance' – Robin

48

Для instanceof вам нужно знать точный класс во время компиляции.

if (foo instanceof ThisClassIKnowRightNow) 
    ... 

Для isInstance класс определяется во время выполнения. (поздняя связка), например.

if (someObject.getClass().isInstance(foo)) 
    ... 
+9

+1: к делу. Также с потоками Java 8 '.filter (ThisClassIKnowRightNow.class :: isInstance)' немного более кратким, чем '.filter (o -> o instanceof ThisClassIKnowRightNow)'. – antak

Смежные вопросы