假设我有以下类层次结构:
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方法提供了一个实现.在一个测试用例中,我在一个类型为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编译器.