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 中,使用javac和 Eclipse 编译器都会出现问题。

4

1 回答 1

0

(根据上面作者的评论做出答案:问题已解决):

进行全面清理和重建也解决了这个问题。

尽管如此,在某些时候肯定存在导致错误二进制文件的错误。

于 2016-02-08T13:49:06.720 回答