面向对象编程中,泛型在增强类型安全性和代码可重用性方面发挥着至关重要的作用。在Java泛型中,使用通配符,例如
考虑以下使用 JUnit 和 Hamcrest 匹配器的示例:
Map<String, Class<? extends Serializable>> expected = null; Map<String, Class<java.util.Date>> result = null; assertThat(result, is(expected));
由于以下原因,此代码无法编译assertThat 方法签名中的泛型类型参数与实际类型不匹配参与。
了解为什么使用 解决了这个问题,让我们深入研究一下协方差的概念。在 Java 中,数组是协变的,这意味着如果类型 T 是 S 的子类型,则相应的数组 T[] 和 S[] 也是子类型。
在给定的示例中,预期的映射可以包含代表 Serialized 子类的 Class 对象的实例。另一方面,结果映射只能保存表示 Date 类的 Class 对象。通过使用 ,assertThat 方法可以接受匹配器,检查某个值是否是扩展 Serialized 的任何类的实例,包括 Date 类。
assertThat JUnit 中的方法是通用的,以确保为结果类型传入适当的匹配器。通过一般将其键入为
切换断言时Matcher 的参数列表延伸T>虽然解决了编译问题,但它确实引入了一个潜在的缺点。这个扩展的参数列表允许任何对扩展 T 的类型进行操作的匹配器,这可能会在某些情况下导致不正确的匹配逻辑。
理解
之间的区别?延伸T>以上是`` 和 ` 有什么区别的详细内容。更多信息请关注PHP中文网其他相关文章!