2012-01-31 13 views
6

Dzień dobry wszystkimDlaczego musimy użyć zmiennej pośredniej dla @SuppressWarnings ("odznaczone")?

Zastanawiałem się, co jest powodem, że

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; 
    } 
} 

jest ważna ale

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

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

jest błąd składni/kompilator?

Jaki jest powód, dla którego musimy użyć zmiennej pośredniej dla @SuppressWarnings("unchecked")?

+0

mmm ... tutaj, ale jeśli przestawiłeś SuppressWarning na blok klasy, jest w porządku chociaż .. +1 za to. – Jasonw

+0

@Jasonw, z http://docs.oracle.com/javase/7/docs/api/java/lang/SuppressWarnings.html: _ "W kwestii stylu, programiści powinni zawsze używać tej adnotacji w najgłębiej zagnieżdżonych element, w którym jest skuteczny. Jeśli chcesz wyłączyć ostrzeżenie w konkretnej metodzie, powinieneś opisać tę metodę, a nie jej klasę. "_ –

Odpowiedz

5

Numer @SuppressWarnings("unchecked") jest stosowany w zakresie deklaracji i cesji zaraz po nim. Może być przypisany do zakresu funkcji lub przypisania konkretnej zmiennej.
W pierwszym przykładzie jest on stosowany do zmiennej lokalnej. W drugim przykładzie próbujesz zastosować go do przypisania pola, które już zostało zadeklarowane.

Zobacz, że to również nie kompiluje:

public class Test<T> { 

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

i nie ma to wpływu na ostrzeżenia:

public class Test<T> { 

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

W skrócie, SuppressWarnings nie mogą być stosowane na zmienną na całym jego zakresie. Jest stosowany w przypadku przypisania + dekleracji (w przypadku zmiennych) lub w całym zakresie metody, gdy jest stosowany w metodzie.

1

Kompiluje dla mnie OK (uproszczony, aby usunąć kod znaczenia):

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]; 
    } 
} 

Tylko obserwacja uwaga jest taka, że ​​@SuppressWarnings idzie na metodzie zamiast linii kodu w b() powodu tłumienia będącego na przypisanie pole zamiast zmiennej lokalnej przypisanie

+0

skasował wcześniejszy komentarz, który został napisany przed edycją :) +1 za miłe wyjaśnienie – posdef

+0

@Bohemian, ale w moim przypadku są inne stwierdzenia w metodzie "b" i chciałbym, aby utrzymać SuppressWarnings tak jak to możliwe. – Pacerier

5

Ponieważ można tylko adnotacji:

  • klas
  • metody
  • zmienne
  • parametry
  • Pakiety

Nie można opisywanie wyrażeń lub oświadczenia.

+0

A czasami tylko ich podzbiór, jeśli użyto adnotacji '@Target (ElementType [])'. – wchargin

Powiązane problemy