Странное поведение по умолчанию для разных версий 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 Compiler.
1 ответ
(Ответ сделан на основе комментария автора выше: проблема была решена):
Выполнение полной очистки и восстановления также решило проблему.
Тем не менее, возможно, в какой-то момент произошла ошибка, которая вызвала сбой двоичных файлов.