Добавить @SuppressWarnings ( "unchecked" ) в generics для одной строки генерирует ошибку компилятора eclipse

Я наткнулся на странное поведение, которое я не понимаю.

Мне нужно передать String в общий файл и вызывать предупреждение.

Type safety : Unchecked cast from String to T
  • Если я добавлю @SuppressWarnings("unchecked") выше объявления метода он отлично работает.

  • Если я добавлю его выше назначения, он выдает ошибку компилятора в затмевать.

Это отлично работает.

@SuppressWarnings("unchecked")
public <T> T search(final String query){
 T returnValue = null;
 ...
 if(returnValue instanceof String){
  returnValue = (T) collection.getString(attrName);
 }

Это не работает нормально.

public <T> T search(final String query){
 T returnValue = null;
 ...
 if(returnValue instanceof String){
  @SuppressWarnings("unchecked") // Compiler error: "returnValue cannot be resolved to a type"
  returnValue = (T) collection.getString(attrName);
 }

Любая идея, что вызывает несоответствие между двумя способами подавления предупреждения?

Ответ 1

У вас не может быть аннотации к произвольным выражениям (возможно, позже они будут добавлены позже).

Однако вы можете добавлять аннотации к объявлениям локальных переменных.

Так что компилятор пытается здесь сделать, это интерпретировать returnValue как тип (как единственное, что может следовать за аннотацией внутри тела метода) и терпит неудачу.

Вложение аннотации в объявление returnValue в этом случае не помогает. Однако вы можете создать новую локальную переменную, в которой вы выполняете листинг в инициализаторе и комментируете это.

@SuppressWarnings("unchecked")
T string = (T) collection.getString(attrName);
returnValue = string;