【发布时间】:2014-12-15 16:35:53
【问题描述】:
长话短说,以下代码在 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 具有此类签名的方法 无需编译器错误?
提前感谢您的帮助!
【问题讨论】:
-
Hmmm ... 在使用
javac编译时,我仍然只收到警告,Eclipse 给了我你描述的错误。这很可能是 IDE 内部编译器中的错误。 -
@Seelenvirtuose 你是绝对正确的 - 刚刚尝试使用
javac并在编译时出现警告。我没有先在javac尝试过,这很糟糕。我将为 JDT 创建错误并在此处发布指向它的链接。顺便说一句,如果您希望它被赞成和接受,请将您的评论作为答案:)
标签: generics compiler-errors java-8 compiler-bug