【问题标题】:Generified static method invocation not compiling in Java 8生成的静态方法调用未在 Java 8 中编译
【发布时间】: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&lt;T&gt;) in the type AnotherSpike is not applicable for the arguments (Class)

虽然完全理解这样的代码不是100%类型安全,但我需要非常相似的调用在的生产代码中工作Java 8(它在编译时出现警告并且在 Java 7 中运行良好)。

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

  1. 如果 &amp; IAliased&lt;K&gt; 从方法签名中删除:

    private static <K, T extends Enum<T>> void meth(final Class<T> clazz)
    
  2. 如果&amp; IAliased&lt;K&gt;在签名中替换为&amp; 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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 2023-03-23
    • 2014-07-28
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多