不同Java版本的奇怪默认方法行为

不同Java版本的奇怪默认方法行为,java,interface,abstract-methods,default-method,java-bridge-method,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> extend

假设我有以下类层次结构:

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
}

:
java-version
输出:
  • (工作地点):

  • 本地(如果失败):


我希望这是某种
javac
bug,编译器无法添加所有必需的桥接方法(代码编译时没有任何警告或错误)。在IntelliJ IDEA中,使用
javac
和Eclipse编译器都会出现问题。

(答案基于作者的上述评论:问题已解决):

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


尽管如此,一定有一个bug在某个点上导致了错误的二进制文件

您是否提供了已经证明是再现错误的最小设置?这里有很多接口,如果不能用更少的接口来演示,那么问题看起来相当复杂。对本地环境中运行时执行的
MutableSet.class
进行反编译。有默认方法吗?@DraganBozanovic,是的,所有超级接口
$plus
方法都有桥接方法。不过,
ArraySet
类中没有桥接方法。没有关于“Netbeans with jdk1.8.065”的重述您的项目结构是什么?在同一jar中执行断言的代码是否与
MutableSet
相同?
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 "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)