2013-03-21 7 views
6

W końcu udało mi się pozbyć wszystkich nowych ostrzeżeń kompilatora wygenerowanych przez program Java 7. Zostałem z tymi dwoma, których nie mogę pojąć. Czy istnieje sposób na pozbycie się ich bez ich tłumienia?Niektóre ostrzeżenia w języku Java 7 - jak je usunąć

Konstruowanie tablicą rodzajowo wpisywanych obiektów (gdzie mogę umieścić w tworzeniu tablicy?):

static final int N = 10; 
//warning: [unchecked] unchecked conversion 
    static final Set<Widget>[] queued = new ConcurrentSkipListSet[N]; 
//required: Set<Widget>[] 
//found: ConcurrentSkipListSet[] 

Generic varargs (wydaje się zdarzyć wszędzie Akceptuję varargs o typ rodzajowy):

class Foo<T> { 
//warning: [unchecked] Possible heap pollution from parameterized vararg type T 
    public void add(T... entries) { 
//where T is a type-variable: 
//T extends Object declared in class Foo 

BTW: mam już:

// Add many entries to the list. 
    public void add(List<T> entries) { 
    // ... 
    } 

    // Add a number of entries. 
    public void add(T... entries) { 
    // Make a list of them. 
    add(Arrays.<T>asList(entries)); 
    } 

Odpowiedz

1

Generic stworzenie tablicy:

static final ConcurrentSkipListSet<Widget>[] queued = newArray(N); 
// note: declare the most specific type for private objects 


@SafeVarargs 
static <E> E[] newArray(int length, E... array) 
{ 
    return Arrays.copyOf(array, length); 
} 

Jak to działa - od newArray jest metodą vararg An E[] array argument musi być podjęta w związku z tym organizm metoda ma dostęp do rodzaju E[]. Jest to teoretycznie poprawne, a jeśli nie ma wymazania, będzie całkowicie bezpieczne w środowisku wykonawczym. Po usunięciu usunięto tylko typ E[] w czasie wykonywania, to dobrze, zwracamy również ten sam usunięty typ.

+0

Wow !! Rozwiązałem oba problemy za jednym razem. Nie rozumiem, w jaki sposób 'newArray (N)' faktycznie przekazuje tablicę odpowiedniego typu do 'newArray', ale czapki z głów dla ciebie proszę. BTW - dostosowałem go do "statycznego końcowego ConcurrentSkipListSet [] queued = DoubleBufferedList. > newArray (N);' dla moich testów. – OldCurmudgeon

+0

dlaczego nie po prostu "statyczny końcowy ConcurrentSkipListSet [] queued = DoubleBufferedList.newArray (N);' – ZhongYu

+0

Ponieważ kiedy to wyrysowałem, ta forma dała mi 'Object []' w drugim parametrze. Z moim dostałem "ConcurrentSkipListSet []", który jest dla mnie lepszy. Zdaję sobie sprawę, że jest to bardzo niewielka różnica, ponieważ obie są po prostu "Object []". – OldCurmudgeon

7

Dla pierwszego z nich:

static final Set<Widget>[] queued = new ConcurrentSkipListSet<>[N]; 

Przed Java 7, musiałby to być:

static final Set<Widget>[] queued = new ConcurrentSkipListSet<Widget>[N]; 

Jednak, jesteś prawdopodobnie lepiej deklarując to jako ArrayList<Set<Widget>>. Ogólnie rzecz biorąc, mieszanie tablic i generycznych jest trochę trudne w Javie.

static final List<Set<Widget>> queued = new ArrayList<>(); 
// or new ArrayList<Set<Widget>>(); 

w odniesieniu do drugiego, patrz this thread. Chociaż możesz stłumić wiadomość, to faktycznie ostrzega przed prawdziwym niebezpieczeństwem. Dolna linia tego wątku jest to, że bezpieczne rzeczą do zrobienia jest, aby zmienić swój podpis metody (i odpowiednie wezwania) do:

class Foo<T> { 
    public void add(List<T> entries) { 
     . . . 

Problem jest w zasadzie taki sam jak pierwszy: nie powinno być tworzenie tablic generycznych.

+0

Próbowałem oba te - dostaję "błąd: ogólne tworzenie tablicy" w obu przypadkach. – OldCurmudgeon

+0

@ OldCurmudgeon - trochę zmodyfikowałem swoją odpowiedź. Użyj 'ArrayList >'. –

+0

Twój odnośnik ostatecznie wskazuje stronę Oracle omawiającą problem, ale nie widzę tam rozwiązania. – OldCurmudgeon

2

Aby rozwiązać ten drugi problem, należy dodać @SafeVarargs do deklaracji metody.

Z javadocs, to jest:

A programmer assertion that the body of the annotated method or constructor does not perform potentially unsafe operations on its varargs parameter. Applying this annotation to a method or constructor suppresses unchecked warnings about a non-reifiable variable arity (vararg) type and suppresses unchecked warnings about parameterized array creation at call sites.