次のクラス階層があるとします。
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 では、javac
Eclipse コンパイラを使用する場合と使用する場合の両方で問題が発生します。