在推断泛型时,Javac编译目标1.7与Eclipse Juno编译JDK 1.7不同

时间:2013-01-14 20:42:41

标签: eclipse compiler-construction javac java-7

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

我有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 - &gt;具有方法“ getInfo()

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

DefaultManager.java - &gt;扩展 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()

你对那里会发生什么有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我发现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<I extends Info>,但这很奇怪。 Eclipse的编译器可以处理这两种语法。