0

現在、組み込みの 1.7 jdk を使用する Eclipse Juno に対して、ターゲット 1.7 およびソース 1.7 を使用する 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 に貼り付けると、すべて正常に動作します。コンパイルエラーはありません。ただし、ターゲットjdk 1.7を使用してGradleでビルドすると、コンパイラはそれを気に入りません:

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()

そこで何が起こるかについて何か考えがありますか?

4

1 に答える 1

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 のコンパイラは、2 つの構文を処理できます。

于 2013-01-15T12:23:22.543 に答える