在Java 8中不编译的泛型静态方法调用

时间:2014-12-15 16:35:53

标签: generics compiler-errors java-8 compiler-bug

简而言之,以下代码未在 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. 如果& IAliased<K>被签名中的& IAliased替换:

    private static <K, T extends Enum<T> & IAliased> void meth(final Class<T> clazz)
    
  3. 以上两个观察结果让我认为更像是Java 8中的编译器错误,而不是对Java 8编译器的深思熟虑的增强,尽管我可能错了。

    无论如何,有人可以建议如何将Class 的原始实例传递给具有此类签名的 meth 方法没有编译器错误?

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

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

使用Eclipse,我得到了您描述的相同错误。但是,在使用JDK编译器时,我仍然只获得警告并进行编译。