Добавление @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;