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

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

Я должен привести String к универсальному, и он выдает предупреждение.

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

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

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

@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;
Другие вопросы по тегам