Почему при проверке экземпляра текущего класса не работает x instanceof getClass()?

У меня есть абстрактный класс AssociativeFunction, который расширяет Expr. Существуют различные функции, которые являются подклассами AssociativeFunction, и есть другие выражения, которые являются подклассами Expr, но не AssociativeFunction.

В методе класса AssociativeFunction мне нужно проверить, является ли объект Expr экземпляром текущего класса или одного из его подклассов,

т. е. Product (расширяет AssociativeFunction) и наследует этот метод; поэтому проверка должна возвращать true для всех объектов Product и всех объектов CrossProduct (расширяет Product), но false для всех объектов Sum (расширяет AssociativeFunction) и Number (расширяет Expr).

  1. #P4#
    if (newArgs.get(i) instanceof getClass()) {
    
    #P5# <цитата> #P6#
  2. Этот код работает, это правильно? Почему он отличается от (1)?

    if (getClass().isInstance(newArgs.get(i))) {
    

person Radon Rosborough    schedule 03.06.2014    source источник
comment
Вы смотрели, как работает ключевое слово instanceof? Вы просмотрели javadoc Class#isInstance()?   -  person Sotirios Delimanolis    schedule 04.06.2014


Ответы (2)


Почему следующее не работает?

Потому что instanceof в основном требует имя типа в качестве второго операнда во время компиляции. Вы не сможете использовать оператор instanceof.

производство для оператора instanceof:

RelationalExpression instanceof ReferenceType

где ReferenceTypeClassOrInterfaceType, TypeVariable или ArrayType... другими словами, имя типа, а не выражение, результатом которого является ссылка Class<?>. То, что вы делаете, немного похоже на попытку объявить переменную типа "текущий класс" - язык просто не определен таким образом.

Этот код работает, это правильно?

да.

Почему он отличается от (1)?

Потому что он использует Class.isInstance метод, а не instanceof оператор. Это просто разные вещи. Метод isInstance фактически является более динамичной версией.

person Jon Skeet    schedule 03.06.2014

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

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

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

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

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

person Redson    schedule 03.06.2014