Данное правило находит тернарные операторы, в которых происходит неявное приведение численных типов. Это может нарушить логику работы программы из-за неожиданной смены типа объекта.
Рассмотрим пример подобной ошибки:
public void writeObject(Serializer serializer, Object o) { .... else if (o instanceof Integer) { serializer.writeInt((Integer) o); } else if (o instanceof Double) { serializer.writeDouble((Double) o); } .... } public void serialize(Serializer serializer) { Object data = condition ? 5 : 0.5; // <= writeObject(serializer, data); }
В данном случае фактическим аргументом метода 'writeObject' всегда будет являться число типа 'double': 5.0 или 0.5. Из-за этого внутри 'writeObject' будет выполнена не та ветка конструкции if-else-if, которая подразумевалась программистом. Исправление этой ошибки заключается в замене тернарного оператора на блок if-else:
public void serialize(Serializer serializer) { if (condition) { writeObject(serializer, 5); } else { writeObject(serializer, 0.5); } // or Object data; if (condition) { data = 5; } else { data = 0.5; } writeObject(serializer, data); }
Особенность этой ошибки состоит в том, что взаимозаменяемые условный и тернарный операторы в реальности могут иметь различное поведение.