【问题标题】:Javac compilation target 1.7 differs from Eclipse Juno compilation JDK 1.7 when infering Generics在推断泛型时,Javac 编译目标 1.7 与 Eclipse Juno 编译 JDK 1.7 不同
【发布时间】:2013-01-14 20:42:41
【问题描述】:

我目前在使用目标 1.7 和源 1.7 与使用内置 1.7 jdk 的 Eclipse Juno 的 Gradle 方面存在编译问题。

我有 5 节课:

Info.java --> 没有方法的接口(例如)

public interface Info { //... }

RealInfo.java --> 扩展Info接口的接口

public interface RealInfo extends Info { //... }

AbstractManager.java --> 具有“getInfo()”方法的抽象类

public abstract class AbstractManager<I extends Info>
{
    public I info;
    public I getInfo()
    {
        return this.info;
    }
}

Manager.java --> 具有“getInfo()”方法的接口

public interface Manager
{
    public <I extends Info> I getInfo();
}

DefaultManager.java --> 扩展AbstractManager

public class DefaultManager extends AbstractManager<RealInfo> implements Manager
{
    //...
}

如果您将此代码复制/粘贴到 Eclipse 中,一切正常。没有编译错误。但是,如果我使用 Gradle 构建它,使用目标 jdk 1.7,编译器将不喜欢它:

DefaultManager.java:16: error: DefaultManager is not abstract and does not override abstract method <I>getInfo() in Manager
public class DefaultManager extends AbstractManager<RealInfo> implements Manager
                                                       ^
  where I is a type-variable:
    I extends Info declared in method <I>getInfo()

你知道那里会发生什么吗?

【问题讨论】:

  • 我认为这不是 Gradle 问题。我怀疑如果你在命令行中使用javac 尝试这个,你会遇到同样的问题。如果是这样,我建议:1)从这个问题中删除 Gradle 标签; 2) 向 Eclipse 人员报告错误。 Eclipse 编译器和 Oracle 编译器之间经常存在差异,而且经常证明 Eclipse 是对的,Oracle 是错的!但是 Eclipse 的人很擅长弄清楚什么是什么并用 Oracle 提出来,这就是为什么我总是建议向他们报告的原因! ;-)
  • 删除了 gradle 标签,因为这与 Gradle 无关。这是javac 和 Eclipse 编译器之间的区别。

标签: eclipse compiler-construction javac java-7


【解决方案1】:

我发现 Javac 似乎不喜欢什么。

我将 AbstractManager 类修改为:

public abstract class AbstractManager<I extends Info>
{
    public I info;
    public <I extends Info> I getInfo()
    {
        return (I) this.info;
    }
}

Gradle 现在在使用 Javac 编译时接受此代码。奇怪的是它不能正确地将I 推断为&lt;I extends Info&gt;。 Eclipse 的编译器可以处理这两种语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多