簡単に言うと、次のコードはJava 8ではコンパイルされていませんが、 Java 7 ではコンパイルおよび実行されていました。
public static void main(final String[] args) {
final Class instance = null;
meth(instance); // compiler error here
}
private static <K, T extends Enum<T> & IAliased<K>> void meth(final Class<T> clazz) {
}
前述の行でエラーが発生し、次のメッセージが表示されます: The method meth(Class<T>) in the type AnotherSpike is not applicable for the arguments (Class)
。
そのようなコードが100% typesafe ではないことは完全に理解していますが、 Java 8の本番コードで動作する非常によく似た呼び出しが必要です(そして、警告付きでコンパイルされ、 Java 7でうまく動作していました)。
興味深いことに、上記のコードは次の場合に正常にコンパイルされます (警告が表示されますが、これは問題ありません)。
& IAliased<K>
メソッド署名から削除された場合:private static <K, T extends Enum<T>> void meth(final Class<T> clazz)
署名内
& IAliased<K>
で置き換えられた場合:& IAliased
private static <K, T extends Enum<T> & IAliased> void meth(final Class<T> clazz)
上記の 2 つの観察結果から、これはJava 8 コンパイラーに対する思慮深い機能強化ではなく、Java 8 のコンパイラーのバグに似ているという考えに至りましたが、私は間違っているかもしれません。
とにかく、コンパイラエラーなしでそのような署名を持つメソッドに生のインスタンスを渡す方法について、誰かがアドバイスできますか?Class
meth
助けてくれてありがとう!