Java-аннотации: при инициализации переменной, а не присваивании? - PullRequest
5 голосов
/ 08 декабря 2011

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

Класс с помощью этого метода компилируется, но выдает предупреждение «unchecked»:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();
    B cloneBoard;
    cloneBoard = (B) board.clone(); //unchecked
}

Это компилируется без предупреждения:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();

    @SuppressWarnings("unchecked")
    B cloneBoard = (B) board.clone();
}

Это не компилируется, но помечает cloneBoard с ошибкой:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();
    B cloneBoard;

    @SuppressWarnings("unchecked")
    cloneBoard = (B) board.clone(); // cloneBoard cannot be resolved to a type;
                                    // VariableDeclaratorID expected
}

В руководстве Sun по аннотациям я не смог найти ответпочему это так: http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html.

Определение грамматики мне тоже не помогло, поскольку я не совсем уверен, что правильно понимаю: http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1

Мне кажется,проблема в том, что аннотации могут специально использоваться для переменных, но только тогда, когда они объявлены;любое последующее назначение не будет охватываться аннотацией.Это правильно?Есть ли более элегантное решение, чем подавление непроверенных предупреждений для всего метода?

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

С Спецификация языка Java - Интерфейсы> Аннотация

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

Может использоваться только в объявлении.

2 голосов
/ 08 декабря 2011

Аннотация является частью декларации;точно так же, как вы не можете написать Object obj, кроме как в точке, где объявлено obj, и final obj, кроме как final Object obj, также запрещено @Deprecated obj.

Что касается элегантности - в идеалеВ любом случае ваши методы не должны быть очень длинными и сложными, но если вы обнаружите, что хотите пометить конкретное назначение этой аннотацией, вы всегда можете использовать простой метод-обертку:

@SuppressWarnings("unchecked")
private static <T extends ClassThatDeclaresCloneAsPublic> T cloneObj(T obj)
    { return (T) obj.clone(); }

(Хотя в этом конкретном случае, я полагаю, вы могли бы написать cloneBoard = board.getClass().cast(board.clone()); и вообще отказаться от аннотации, если хотите.)

1 голос
/ 08 декабря 2011

Аннотации являются частью декларации (другие уже ответили на эту часть).

Однако, чтобы ответить на вторую часть вашего вопроса: У меня никогда не было проблем с пометкой всего метода этой аннотацией, когда метод такой короткий. Я лично предпочитаю аннотации на уровне метода / класса, а не внутри методов, потому что я думаю, что они просто отвлекают читателя.

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