Странная ошибка Java с аннотациями - PullRequest
1 голос
/ 25 июня 2009

Попробуйте написать:

List<Object> list;
@SuppressWarnings("unchecked")
list = (List<Object>) new Object();

В 3-й строке произойдет сбой слова list со следующим:

list cannot be resolved to a type

Я понимаю, что это связано с тем, как работают аннотации. Кто-нибудь знает причину этого?

РЕДАКТИРОВАТЬ: спасибо за быстрый ответ. Я знал, что это сработало бы, если бы присвоение было сделано также декларацией.

Ответы [ 3 ]

2 голосов
/ 25 июня 2009

Вы должны поместить аннотацию в декларацию, а не только в присвоение. Это компилирует:

@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) new Object();

См. Javadocs для SuppressWarnings, в котором цели указаны как

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

И если вы посмотрите вверх LOCAL_VARIABLE, он говорит:

Объявление локальной переменной

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

1 голос
/ 25 июня 2009

Из Sun Учебник по аннотациям :

Аннотации могут применяться к программным объявлениям классов, полей, методов и других элементов программы.

Конечная фраза «и другие элементы программы» неутешительно расплывчата, но согласно Язык программирования Java - Аннотации :

Как только тип аннотации определен, вы можете использовать его для аннотирования объявлений. Аннотация - это особый вид модификатора, который можно использовать везде, где могут использоваться другие модификаторы (например, public, static или final). По соглашению аннотации предшествуют другим модификаторам. Аннотации состоят из символа (@), за которым следует тип аннотации и заключенный в скобки список пар элемент-значение. Значения должны быть константами времени компиляции.

, который дает понять, что аннотации могут применяться только к объявлениям.

0 голосов
/ 25 июня 2009

Аннотация должна быть размещена в объявлении, а не в выражении

@SuppressWarnings("unchecked") List<Object> lst 
   = (List<Object>)getProperty("mylist");
list = lst;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...