2

长话短说,以下代码未在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中运行良好)。

有趣的是,上面的代码在以下情况下编译得很好(带有警告,但这没关系):

  1. 如果& IAliased<K>从方法签名中删除:

    private static <K, T extends Enum<T>> void meth(final Class<T> clazz)
    
  2. if& IAliased<K>替换为& IAliasedin 签名:

    private static <K, T extends Enum<T> & IAliased> void meth(final Class<T> clazz)
    

以上两个观察使我认为更像是 Java 8 中的编译器错误,而不是对 Java 8 编译器的深思熟虑的增强,尽管我可能弄错了。

无论如何,有人可以建议我如何将原始实例传递Class meth 具有这种签名的方法而不会出现编译器错误?

提前感谢您的帮助!

4

1 回答 1

4

这似乎是 IDE 内部编译器中的一个错误。

使用 Eclipse,我得到了与您描述的相同的错误。但是,当使用 JDK 编译器时,我仍然只收到警告并且它会编译。

于 2014-12-15T18:11:35.400 回答