简而言之,以下代码未在 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)
如果& IAliased<K>
被签名中的& IAliased
替换:
private static <K, T extends Enum<T> & IAliased> void meth(final Class<T> clazz)
以上两个观察结果让我认为这更像是Java 8中的编译器错误,而不是对Java 8编译器的深思熟虑的增强,尽管我可能错了。
无论如何,有人可以建议如何将Class
的原始实例传递给具有此类签名的 meth
方法没有编译器错误?
提前感谢您的帮助!
答案 0 :(得分:4)
这似乎是IDE内部编译器中的一个错误。
使用Eclipse,我得到了您描述的相同错误。但是,在使用JDK编译器时,我仍然只获得警告并进行编译。