长话短说,以下代码无法在 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 编译器时,我仍然只收到警告并且它可以编译。
关于generics - 通用静态方法调用无法在 Java 8 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27488719/