长话短说,以下代码未在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% 类型安全的,但我需要在Java 8的生产代码中使用非常相似的调用(并且它在编译时带有警告并且在Java 7中运行良好)。
有趣的是,上面的代码在以下情况下编译得很好(带有警告,但这没关系):
如果
& IAliased<K>
从方法签名中删除:private static <K, T extends Enum<T>> void meth(final Class<T> clazz)
if
& IAliased<K>
替换为& IAliased
in 签名:private static <K, T extends Enum<T> & IAliased> void meth(final Class<T> clazz)
以上两个观察使我认为这更像是 Java 8 中的编译器错误,而不是对 Java 8 编译器的深思熟虑的增强,尽管我可能弄错了。
无论如何,有人可以建议我如何将原始实例传递Class
给 meth
具有这种签名的方法而不会出现编译器错误?
提前感谢您的帮助!