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

k1e*_*ran 11 java generics hamcrest generic-collections

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

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

我已经在另一个stackoverflow中读到了关于使用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"))));
    }


}
Run Code Online (Sandbox Code Playgroud)

new*_*cct 17

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

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

或者,查看文档CoreMatchers,似乎您可以考虑使用替代的重载allOf,这需要一个Iterable匹配器.您可以使用没有未经检查的操作.