Вы получаете этот результат, потому что ваши proc
методы не перекрывают друг друга.
Самый простой способ увидеть это - добавить @Override
-аннотацию:
static class Z extends Y {
public Z() {
v += 9;
}
@Override
public void proc(Z p) {
System.out.println(34);
}
}
Это не удастся скомпилировать с сообщением об ошибке
Метод proc ( Test.Z) типа Test.Z должен переопределить или реализовать метод супертипа
blockquote>Рекомендуется добавлять эту аннотацию всякий раз, когда вы собираетесь переопределить метод - таким образом компилятор может проверить, Вы действительно делаете.
Чтобы исправить ошибку и переопределить метод для получения ожидаемого результата, вы можете изменить тип параметра на
X
:static class Z extends Y { public Z() { v += 9; } @Override public void proc(X p) { System.out.println(34); } }
Теперь он снова компилируется и выдает
34
.
В вашем примере произошло то, что вместо переопределения ваш класс
Z
добавил перегруженный методvoid proc(Z p)
в дополнение к к методуvoid proc(X p)
изX
. Разрешение перегрузки основано на типе времени компиляции, поэтому только метод изX
доступен и выбирается. Этот метод переопределен вY
, так что это то, что фактически выполняется во время выполнения.Следовательно, другой способ получить ожидаемый результат - оставить
X
,Y
иZ
без изменений и изменить тип ссылкиx
наZ
:[ 1131] Эта версия вызывает перегруженный метод изpublic static void main(String[] args) { Z x = new Z(); Y y = new Z(); Z z = new Z(); x.proc(z);//// 1 System.out.println(y.getV()); }
Z
, потому что это наиболее специфическая перегрузка для параметра типаZ
.
Да, просто используйте:
<%! @SuppressWarnings("unchecked") %>
Если Вы получаете предупреждения в коде, сгенерированном от JSP (или во встроенном коде в JSP), одно решение состоит в том, чтобы переместить проблемный код в Сервлет или в служебный класс. Тем путем можно отметить его до содержания основы, и JSP имеет меньше кода Java в нем. Взаимовыгодный!
Я не верю так, на самом деле я полагаю, что аннотации не могут использоваться в файле JSP. Вы сделаете, Вы использовать попытку / ловите и обрабатываете свое исключение.