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

问题描述 投票:0回答:1

我目前在使用目标 1.7 和源 1.7 的 Gradle 与使用内置 1.7 jdk 的 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 --> 具有方法“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()

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

eclipse java-7 javac
1个回答
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
推断为
<I extends Info>
。 Eclipse 的编译器可以处理这两种语法。

© www.soinside.com 2019 - 2024. All rights reserved.