Почему я все еще получаю предупреждения при использовании @SuppressWarnings («непроверенный»)? - PullRequest
0 голосов
/ 19 февраля 2020
class Lenkeliste<T> implements Liste<T>{
  @SuppressWarnings({"unchecked"})
  private int iBruk = 0;
  private T[] liste = (T[]) new Object[10];

  public int stoerrelse(){
    return iBruk;
  }
  public void leggTil(int pos, T x) {
    if (pos < 0 || pos >= iBruk) {
      throw new UgyldigListeIndeks(pos);
    }
    if (iBruk == liste.lenght) {
      @SuppressWarnings({"unchecked"})
      T[] ny = (T[]) new Object[2*iBruk];
      for (int i = pos; i < iBruk; i++) {
        ny[i] = liste[i];
        liste = ny;
        liste[i+1] = liste[i];
      }
      liste[pos] = x;
      iBruk++;
    }
  }
  public void leggTil(T x) {
    if (iBruk == liste.lenght) {
      @SuppressWarnings({"unchecked"})
      T[] ny = (T[]) new Object[2*iBruk];
      for (int i = 0; i < iBruk; i++) {
        ny[i] = liste[i];
        liste = ny;
      }
      liste[iBruk] = x;
      iBruk++;
    }
  }
  public void sett(int pos, T x) {
    if (pos < 0 || pos >= iBruk) {
      throw new UgyldigListeIndeks(pos);
    }
    liste[pos] = x;
  }
  public T hent(int pos) {
    if (pos < 0 || pos >= iBruk) {
      throw new UgyldigListeIndeks(pos);
    }
    return liste[pos];
  }
  public T fjern(int pos) {
    if (pos < 0 || pos >= iBruk) {
      throw new UgyldigListeIndeks(pos);
    }
    T bort = liste[pos];
    for (int i = pos+1; i < iBruk; i++) {
      liste[i-1] = liste[i];
    }
    iBruk--;
    return bort;
  }
  public T fjern() {
    T ut = liste[0];
    for (int i = 1; i < iBruk; i++) {
      liste[i-1] = liste[i];
    }
    iBruk--;
    return ut;
  }
}

Это код, который у меня есть. Учитель использовал подобный код и заставил его работать, но я все еще получаю предупреждения. Вот ошибки, которые я получаю:

Lenkeliste.java:15: error: cannot find symbol
    if (iBruk == liste.lenght) {
                      ^
  symbol:   variable lenght
  location: variable liste of type T[]
  where T is a type-variable:
    T extends Object declared in class Lenkeliste
Lenkeliste.java:28: error: cannot find symbol
    if (iBruk == liste.lenght) {
                      ^
  symbol:   variable lenght
  location: variable liste of type T[]
  where T is a type-variable:
    T extends Object declared in class Lenkeliste
Note: Lenkeliste.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020
@SuppressWarnings({"unchecked"})
private int iBruk = 0;
private T[] liste = (T[]) new Object[10];

SuppressWarnings применяется к объявлению int, а не к T[].

. Вставьте подавление во второе объявление.

private int iBruk = 0;
@SuppressWarnings({"unchecked"})
private T[] liste = (T[]) new Object[10];

Также обратите внимание, что строки liste = ny; в методах leggTil не должны быть внутри l oop. Если это так, вы только скопируете первый элемент массива в новый массив, прежде чем перезаписать liste, поэтому последующие итерации просто установят для элементов массива их текущее значение (т. Е. Ноль).

  for (int i = 0; i < iBruk; i++) {
    ny[i] = liste[i];
  }
  liste = ny;
1 голос
/ 19 февраля 2020

Рассмотрим следующий минимальный пример:

public class Test<T> {
    public Test() {
        Object[] arr = new Object[10];
        T[] new_arr = (T[])arr;
    }
}

Это выдает следующее предупреждение:

Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Я могу перекомпилировать и посмотреть подробности о том, какие операции я не проверяю:

Test.java:5: warning: [unchecked] unchecked cast
        T[] new_arr = (T[])arr;
                           ^
  required: T[]
  found:    Object[]
  where T is a type-variable:
    T extends Object declared in class Test
1 warning

Я могу подавить все непроверенные предупреждения для всего класса:

@SuppressWarnings({"unchecked"})// @SuppressWarnings("unchecked") would also work here
public class Test<T> {
    public Test() {
        Object[] arr = new Object[10];
        T[] new_arr = (T[])arr;
    }
}

Или я могу подавить предупреждения для указанного метода c, в данном случае конструктор:

public class Test<T> {
    @SuppressWarnings("unchecked")//@SuppressWarnings({"unchecked"}) would also work here
    public Test() {
        Object[] arr = new Object[10];
        T[] new_arr = (T[])arr;
    }
}

В вашем случае у вас также есть объявление переменной, поэтому вам нужно сделать:

public class Test<T> {

    @SuppressWarnings("unchecked")
    T[] other_arr = (T[])new Object[10];

    @SuppressWarnings("unchecked")
    public Test() {
        Object[] arr = new Object[10];
        T[] new_arr = (T[])arr;
    }
}

Стоит отметить, что в вашем исходном коде есть ошибки компиляции, и они должны быть устранены первыми.

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

...