2013-07-16 7 views
8

In meinem UT-Code, unter extrahieren, ich sehe Warnung:"Ungeprüfter generische Array-Erstellung für varargs Parameter vom Typ Matcher <erweitert String?> []" Warnung CoreMatchers.allOf()

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

Ich habe in einem anderen stackoverflow answer über die Probleme mit einem generischen Parameter zu einer Varargs-Methode gelesen.

Aber gibt es eine nette Möglichkeit, diesen Test leicht zu restrukturieren, um die hässliche Warnung loszuwerden und @SuppressWarnings zu vermeiden?

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


} 

Antwort

12

Wenn diese Java 7+ ist, dann ist die Bibliothek, die Sie verwenden, können Sie die Methode mit @SafeVarargs mit Anmerkungen versehen. Dies ist jedoch nicht unter Ihrer Kontrolle.

Andernfalls gibt es keine Möglichkeit, eine ungeprüfte Warnung mit dieser Methode zu vermeiden, da die Methode grundsätzlich ein Array eines parametrisierten Typs benötigt und es unmöglich ist, einen nicht-null Wert dieses Typs ohne eine ungeprüfte Operation zu erhalten (entweder in Ihrer Methode oder in einer anderen Methode, die Sie aufrufen).

Oder, Blick auf die Dokumentation für CoreMatchers, scheint es, dass Sie die alternative Überladung der allOf, die eine Iterable von Matcher statt nehmen könnte. Das können Sie ohne ungeprüfte Operationen verwenden.

+0

Beachten Sie, dass der Compiler erzwingt, dass '@ SafeVarargs' auf eine ** final ** -Methode gesetzt ist, was natürlich an Schnittstellen nicht möglich ist. – Brice

Verwandte Themen