在推断泛型时,Javac编译目标1.7与EclipseJuno编译JDK1.7不同

在推断泛型时,Javac编译目标1.7与EclipseJuno编译JDK1.7不同,eclipse,compiler-construction,javac,java-7,Eclipse,Compiler Construction,Javac,Java 7,我目前在使用Target1.7和Source1.7的Gradle与使用内置1.7JDK的EclipseJuno之间存在编译问题 我有5门课: Info.java-->没有方法的接口(例如) RealInfo.java-->扩展Info接口的接口 public interface RealInfo extends Info { //... } AbstractManager.java-->具有方法“getInfo()的抽象类 公共抽象类抽象管理器 { 公共信息; 公共I getInfo() {

我目前在使用Target1.7和Source1.7的Gradle与使用内置1.7JDK的EclipseJuno之间存在编译问题

我有5门课:

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

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

public interface RealInfo extends Info { //... }
AbstractManager.java-->具有方法“getInfo()的抽象类

公共抽象类抽象管理器
{
公共信息;
公共I getInfo()
{
返回此.info;
}
}
Manager.java-->具有方法“getInfo()的接口

公共接口管理器
{
公共I getInfo();
}
DefaultManager.java-->扩展了AbstractManager

公共类DefaultManager扩展AbstractManager实现管理器
{
//...
}
如果将此代码复制/粘贴到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()
DefaultManager.java:16:错误:DefaultManager不是抽象的,并且不重写Manager中的抽象方法getInfo()
公共类DefaultManager扩展AbstractManager实现管理器
^
其中I是类型变量:
我扩展了方法getInfo()中声明的信息

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

我发现Javac似乎不喜欢什么

我将AbstractManager类修改为:

public abstract class AbstractManager<I extends Info>
{
    public I info;
    public <I extends Info> I getInfo()
    {
        return (I) this.info;
    }
}
公共抽象类抽象管理器
{
公共信息;
公共I getInfo()
{
返回(I)this.info;
}
}

Gradle现在在使用Javac编译时接受此代码。奇怪的是,它不能正确地推断出
I
。Eclipse的编译器可以处理这两种语法。

我不认为这是一个Gradle问题。我怀疑如果您在命令行中使用
javac
尝试此操作,您也会遇到同样的问题。如果是这样的话,我建议:1)去掉这个问题的Gradle标签;2) 向Eclipse人员报告错误。Eclipse编译器和Oracle编译器之间经常存在差异,结果往往是Eclipse是正确的,Oracle是错误的!但是Eclipse的家伙们非常擅长找出什么是什么,并向Oracle提出,这就是为什么我总是建议向他们报告的原因!;-)删除了gradle标签,因为这与gradle无关。这是
javac
和Eclipse编译器之间的区别。
public interface Manager
{
    public <I extends Info> I getInfo();
}
public class DefaultManager extends AbstractManager<RealInfo> implements Manager
{
    //...
}
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()
public abstract class AbstractManager<I extends Info>
{
    public I info;
    public <I extends Info> I getInfo()
    {
        return (I) this.info;
    }
}