Анализатор обнаружил, что метод не переопределяет метод базового класса или интерфейса, однако сигнатуры этих методов очень похожи.
Рассмотрим синтетический пример:
public class Base { public String someThing() { return "Base"; } } public class Derived extends Base { public String something() // <= { return "Derived"; } }
В приведенном примере, при переопределении метода 'someThing' в классе 'Derived' была допущена опечатка в названии метода. Из-за этой опечатки переопределения метода не произойдет. Эффект от этой ошибки проявится при использовании полиморфизма:
... List<Base> list = new ArrayList<>(); list.add(new Base()); list.add(new Derived()); StringBuilder builder = new StringBuilder(); for (Base base : list) { builder.append(base.someThing()); } String result = builder.toString(); ...
Из-за ошибки переопределения метода в переменной 'result' будет сохранена строка 'BaseBase', а не 'BaseDerived' как ожидалось.
Для защиты от ошибок переопределения метода в Java используется аннотация '@Override'. Если метод помечен этой аннотацией и не переопределяет никакой метод, то компилятор сообщит об ошибке и программа не скомпилируется.
Исправленный вариант кода:
public class Base { public String someThing() { return "Base"; } } public class Derived extends Base { @Override public String someThing() //ok { return "Derived"; } }
Вот еще несколько примеров, когда произойдет срабатывание анализатора.
import first.A; public class Base { public void someThing(A input) { ... } } import second.A; public class Derived extends Base { public void someThing(A input) // <= { ... } }
Имена типов аргументов 'input' в объявлении методов одинаковые. Однако данные типы расположены в разных пакетах 'first' и 'second', из-за чего произойдет перегрузка метода вместо переопределения.
package first; public class Base { void someThing() { ... } } package second; import first.Base; public class Derived extends Base { void someThing() // <= { ... } }
В этом примере классы 'Base' и 'Derived' расположены в разных пакетах, 'first' и 'second' соответственно. Метод 'someThing' в классе 'Base' объявлен без каких-либо модификаторов, поэтому имеет уровень доступа по умолчанию (package-private), из-за чего его не видно в классе 'Derived', который находится в другом пакете. Именно поэтому переопределения метода не произойдет, о чем и предупредит анализатор.