给出以下示例(使用带有Hamcrest匹配器的JUnit):
Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<java.util.Date>> result = null;
assertThat(result, is(expected));
Run Code Online (Sandbox Code Playgroud)
这不能使用JUnit assertThat方法签名编译:
public static <T> void assertThat(T actual, Matcher<T> matcher)
Run Code Online (Sandbox Code Playgroud)
编译器错误消息是:
Error:Error:line (102)cannot find symbol method
assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>,
org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class
<? extends java.io.Serializable>>>)
Run Code Online (Sandbox Code Playgroud)
但是,如果我将assertThat方法签名更改为:
public static <T> void assertThat(T result, Matcher<? extends T> matcher)
Run Code Online (Sandbox Code Playgroud)
然后编译工作.
所以有三个问题:
assertThat方法更改为Matcher<? extends T>?是否有任何缺点?如果你这样做,还有其他案例会破裂吗?assertThat在JUnit 中对方法进行泛化是否有任何意义?该Matcher级似乎并不需要它,因为JUnit的调用matches方法,它不与任何普通类型的,只是看起来像一个企图迫使一个类型安全这并不做任何事情,因为Matcher实际上只会不匹配,无论如何测试都会失败.不涉及不安全的操作(或似乎如此).供参考,以下是JUnit的实现assertThat:
public static <T> void assertThat(T actual, Matcher<T> matcher) {
assertThat("", …Run Code Online (Sandbox Code Playgroud)