Java泛型何时需要<?扩展了T>而不是<T>,切换是否有不利之处?
给定以下示例(将JUnit与Hamcrest匹配器一起使用): Map<String, Class<? extends Serializable>> expected = null; Map<String, Class<java.util.Date>> result = null; assertThat(result, is(expected)); 这不能与以下内容的JUnit assertThat方法签名一起编译: public static <T> void assertThat(T actual, Matcher<T> matcher) 编译器错误消息是: 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>>>) 但是,如果我将assertThat方法签名更改为: public static <T> void assertThat(T result, Matcher<? extends T> matcher) 然后编译工作。 所以三个问题: 为什么当前版本完全不编译?尽管我在这里含糊地理解了协方差问题,但如果必须的话,我当然无法解释。 …