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

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

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

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 Ответ

50 голосов
/ 12 сентября 2011

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

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

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

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

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