10

次のクラス階層があるとします。

interface Collection<E>
{
    Collection<E> $plus(E element)
}

interface MutableCollection<E> extends Collection<E>
{
    @Override
    MutableCollection<E> $plus(E element)
}

interface Set<E> extends Collection<E>
{
    @Override
    Set<E> $plus(E element)
}

interface MutableSet<E> extends Set<E>, MutableCollection<E>
{
    @Override
    default MutableSet<E> $plus(E element)
    {
        // ... implementation
    }
}

abstract class AbstractArraySet<E> implements Set<E>
{
    // ... no $plus(...) implementation
}

class ArraySet<E> extends AbstractArraySet<E> implements MutableSet<E>
{
    // ... no $plus(...) implementation
}

ご覧のとおり、MutableSetクラスのみが$plusメソッドの実装を提供します。テスト ケースでは、 type のインスタンスでこのメソッドを呼び出していますArraySet。CI 環境では常にテストに合格しますがAbstractMethodError、ローカル環境では常に失敗します。どちらの場合も、Gradle (2.7) を使用しています。


エラー:

java.lang.AbstractMethodError: Method dyvil/collection/mutable/ArraySet.$plus(Ljava/lang/Object;)Ldyvil/collection/Collection; is abstract

    at dyvil.collection.mutable.ArraySet.$plus(ArraySet.java)
    at dyvil.tests.CollectionTests.testCollection(CollectionTests.java:99)
    at ...

テストコード:

testCollection(new ArraySet());

public void testCollection(Collection collection)
{
    assertEquals(mutable.$plus("newElement"), collection.$plus("newElement"));
}

java -version出力:

  • CI (動作する場所):

    java version "1.8.0"
    Java(TM) SE Runtime Environment (build 1.8.0-b132)
    Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
    
  • ローカル (失敗した場所):

    java version "1.8.0_71"
    Java(TM) SE Runtime Environment (build 1.8.0_71-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, mixed mode)
    

javacこれは、コンパイラが必要なすべてのブリッジ メソッドを追加できない (コードは警告やエラーなしでコンパイルされる) 何らかのバグであると予想しています。IntelliJ IDEA では、javacEclipse コンパイラを使用する場合と使用する場合の両方で問題が発生します。

4

1 に答える 1

0

(回答は上記の著者のコメントに基づいて行われます:問題は解決されました):

完全なクリーンアップと再構築を行うと、問題も修正されました。

それにもかかわらず、ある時点でバグが関与して、バイナリの欠陥が発生したに違いありません。

于 2016-02-08T13:49:06.720 に答える