长话短说,下面的代码不是在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
带有签名的原始实例传递给方法吗?
在此先感谢您的帮助!
这似乎是IDE内部编译器中的错误。
使用Eclipse,我得到的错误与您描述的相同。但是,当使用JDK编译器时,我仍然仅收到警告并进行编译。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句