Подтвердить что ты не робот

Странное поведение метода по умолчанию с разными версиями Java

Скажем, у меня есть следующая иерархия классов:

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.

4b9b3361

Ответ 1

(Ответ сделан на основе комментария автора выше: проблема решена):

Выполняя полную очистку и восстановление, также исправлена ​​проблема.

Тем не менее, в какой-то момент, должно быть, произошла ошибка, вызвавшая неисправные двоичные файлы.