我们说我有以下类层次结构:
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编译器都会出现问题。
答案 0 :(得分:0)
(根据上面作者的评论回答:问题解决了):
完全清理和重建也解决了问题。
尽管如此,某些地方肯定有一个错误导致错误的二进制文件。