使用不同Java版本的Strange Default Method行为

时间:2016-01-31 14:39:02

标签: java interface abstract-methods default-method java-bridge-method

我们说我有以下类层次结构:

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 ...

Test Code

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编译器都会出现问题。

1 个答案:

答案 0 :(得分:0)

(根据上面作者的评论回答:问题解决了):

完全清理和重建也解决了问题。

尽管如此,某些地方肯定有一个错误导致错误的二进制文件。