2013-07-16 10 views
8

W moim kodu UT, wyciąg poniżej, widzę ostrzeżenie:"Nieograniczony stworzenie tablicy rodzajowy dla varargs parametr typu String rozciąga Matcher <?> []" Ostrzeżenie Używanie CoreMatchers.allOf()

Unchecked generic array creation for varargs parameter of
type Matcher <? extends String> []

Przeczytałem w innym stackoverflow answer o problemach przy użyciu ogólnego parametru do metody varargs.

Ale czy jest jakiś sposób, aby nieco zrestrukturyzować ten test, aby pozbyć się brzydkiego ostrzeżenia i uniknąć @SuppressWarnings?

package stackoverflow; 

import org.hamcrest.CoreMatchers; 
import org.junit.Assert; 
import org.junit.Test; 
import static org.junit.matchers.JUnitMatchers.containsString; 
import static org.hamcrest.CoreMatchers.not; 

public class FooTest { 


    @SuppressWarnings({"unchecked"}) 
    @Test 
    public void sampleTest() { 

     Assert.assertThat("foo bar", 
       CoreMatchers.allOf(
       containsString("foo"), 
       containsString("bar"), 
       not(containsString("baz")))); 
    } 


} 

Odpowiedz

12

Jeśli jest to Java 7+, wówczas biblioteka używasz może opisywać metody z @SafeVarargs. Jednak to nie jest pod twoją kontrolą.

W przeciwnym razie nie ma sposobu na uniknięcie niezaznaczonego ostrzeżenia za pomocą tej metody, ponieważ metoda zasadniczo wymaga tablicy sparametryzowanego typu, a uzyskanie takiej wartości nie jest możliwe bez niezaznaczonej operacji (albo w swojej metodzie, albo w innej wybranej przez ciebie metodzie).

Albo, patrząc na dokumentację dla CoreMatchers, wydaje się, że można rozważyć użycie alternatywnego przeciążenia z allOf, które ma zamiast tego Iterable dopasowań. Możesz używać bez niezaznaczonych operacji.

+0

Zauważ, że kompilator będzie wymuszał ustawienie '@ SafeVarargs' na ** ostatecznej ** metodzie, co nie jest oczywiście możliwe w przypadku interfejsów. – Brice

Powiązane problemy