“使用CoreMatchers.allOf()的类型为Matcher <! - ?extends String - > []”警告的varargs参数的未经检查的通用数组创建

时间:2013-07-16 14:32:16

标签: java generics generic-collections hamcrest

在我的UT代码中,在下面提取,我看到警告:

  

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

我已经在另一个stackoverflow answer中读到了使用varargs方法的泛型参数的问题。

但有没有一种巧妙的方法来稍微重组这个测试以摆脱丑陋的警告并避免@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"))));
    }


}

1 个答案:

答案 0 :(得分:16)

如果这是Java 7+,那么您使用的库可以使用@SafeVarargs注释该方法。但是,这不在你的控制之下。

否则无法使用此方法避免未经检查的警告,因为该方法从根本上需要一个参数化类型的数组,如果没有取消选中,则无法获得此类型的非null值在某处操作(在您的方法或您调用的其他方法中)。

或者,查看CoreMatchers的文档,您似乎可以考虑使用allOf的备用重载,而这需要Iterable匹配器。没有未经检查的操作就可以使用。