Почему мы должны использовать промежуточную переменную для @SuppressWarnings («unchecked»)? - PullRequest
6 голосов
/ 31 января 2012

Добрый день всем,

Мне было интересно, в чем причина того, что

public class test<T> {
    T[] backing_array;

    public void a(int initial_capacity) {
        @SuppressWarnings("unchecked")
        T[] backing_array = (T[]) new Object[initial_capacity];
        this.backing_array = backing_array;
    }
}

допустимо, но

public class test<T> {
    T[] backing_array;

    public void b(int initial_capacity) {
        @SuppressWarnings("unchecked")
        this.backing_array = (T[]) new Object[initial_capacity];
    }
}

является ошибкой синтаксиса / компилятора?

По какой причине мы должны использовать промежуточную переменную для @SuppressWarnings("unchecked")?

Ответы [ 3 ]

5 голосов
/ 31 января 2012

Поскольку вы можете аннотировать только:

  • классы
  • методы
  • переменные
  • параметры
  • пакеты

Вы не можете комментировать выражения или заявления.

5 голосов
/ 31 января 2012

@SuppressWarnings("unchecked") применяется к объему декларации и уступки сразу после нее.Он может быть назначен области действия функций или назначению конкретной переменной.
В вашем первом примере он применяется к локальной переменной.Во втором примере вы пытаетесь применить его к присвоению поля, которое уже было объявлено.

Обратите внимание, что это также не компилируется:

public class Test<T> {

    public void a(int initial_capacity) {
        T[] backing_array;
        @SuppressWarnings("unchecked")
        backing_array = (T[]) new Object[initial_capacity];
    }
}

, и это имеетне влияет на предупреждения:

public class Test<T> {

    public void a(int initial_capacity) {
        @SuppressWarnings("unchecked")
        T[] backing_array;
        backing_array = (T[]) new Object[initial_capacity];
    }
}

Короче говоря, SuppressWarnings нельзя применять к переменным во всей области видимости.Он применяется к присваиванию + объявлению (для переменных) или ко всей области действия метода при применении к методу.

1 голос
/ 31 января 2012

Компилирует нормально для меня (упрощено удаление ненужного кода):

public static class Test<T> {
    T[] array;

    public void a() {
        @SuppressWarnings("unchecked")
        T[] a = (T[]) new Object[1];
        this.array = a;
    }

    @SuppressWarnings("unchecked")
    public void b() {
        this.array = (T[]) new Object[1];
    }
}

Единственное замечание примечания состоит в том, что @SuppressWarnings идет по методу , а не по строке кода в b() из-за подавления в назначении поля вместо локальная переменная присваивание

...