Основное отличие состоит в том, что instanceof
является ключевым словом Java, а obj in SomeClass
является эквивалентом вызова метода SomeClass.isCase(obj)
, как вы упомянули в своем вопросе.
Существует одно важное следствие: instanceof
не может быть переопределено, и, как говорится в документации Oracle:
Оператор instanceof
сравнивает объект с указанным типом. Вы можете использовать его, чтобы проверить, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.
Class.isCase(obj)
реализован следующим образом:
<code>/**
* Special 'Case' implementation for Class, which allows testing
* for a certain class in a switch statement.
* For example:
* <pre>switch( obj ) {
* case List :
* // obj is a list
* break;
* case Set :
* // etc
* }
*
* @param caseValue значение регистра
* @param switchValue значение переключателя
* @return true, если switchValue считается назначаемым из данного класса
* @since 1.0
* /
public static boolean isCase (Class caseValue, Object switchValue) {
if (switchValue instanceof Class) {
Класс val = (Класс) switchValue;
return caseValue.isAssignableFrom (val);
}
return caseValue.isInstance (switchValue);
}
Источник: org / codehaus / groovy / runtime / DefaultGroovyMethods.java # L1121
Как вы можете видеть на основе исходного кода, Groovy obj in SomeClass
не является псевдонимом instanceof
, потому что он делает немного больше. Однако стоит упомянуть одну важную вещь: вы можете переопределить реализацию isCase()
, но вы не можете изменить поведение ключевого слова instanceof
Java. Переопределение Class.isCase()
может привести к некоторому повреждению вашего кода, если вы используете его в качестве альтернативы ключевому слову Java instanceof
.