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) その後、コンパイルが機能します。 したがって、3つの質問: 現在のバージョンが正確にコンパイルされないのはなぜですか?ここでは共分散の問題を漠然と理解していますが、説明が必要な場合は、説明できませんでした。 …