Java 泛型:与
Java 泛型允许您创建可以对一系列数据类型进行操作的类型安全集合和方法。使用泛型时,了解 之间的区别延伸T>
考虑以下示例:
Map<String, Class<? extends Serializable>> expected = null; Map<String, Class<Date>> result = null; assertThat(result, is(expected));
此示例生成一个编译错误,并显示以下消息:
Error: 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>>>)
为什么此版本编译失败?
原因在于使用了
将assertThat更改为Matcher?
将assertThat更改为Matcher允许我们传入一个与 T 的超类型相匹配的 Matcher。虽然这看起来像是一个简单的更改,但它可能会导致意外的行为。例如,如果我们有一个匹配字符串列表的匹配器,我们可以将其传递给需要对象列表匹配器的方法。在这种情况下,Matcher 将无法正确匹配实际参数,可能会导致不正确的结果。
是否有必要在 JUnit 中泛化 assertThat 方法?
JUnit中assertThat的泛化旨在确保类型安全并防止预期类型与实际类型之间的不匹配。然而,如上所述,如果使用不小心,它也可能导致潜在的问题。
建议
在
使用
以上是为什么使用'Map”时'assertThat”方法无法编译的详细内容。更多信息请关注PHP中文网其他相关文章!