javainterfaceabstract-methodsdefault-methodjava-bridge-method

Strange Default Method behavior with different Java versions


Let's say I have the following class hierarchy:

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
}

As you can see, only the MutableSet class provides an implementation for the $plus method. In a Test case, I am calling this method on an instance of type ArraySet. The Test always passes in the CI environment, while it always fails with an AbstractMethodError on my local environment. In both cases, I am using Gradle (2.7).


The Error:

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 output:


I am expecting this to be some sort of javac bug, where the compiler fails to add all required bridge methods (the code compiles without any warnings or errors). In IntelliJ IDEA, the problem occurs both using javac and the Eclipse Compiler.


Solution

  • (Answer is made based on author's comment above: problem was solved):

    Doing a full clean and rebuild fixed the problem as well.

    Nevertheless, there must have been a bug involved at some point that caused the faulty binaries.