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

前端之家收集整理的这篇文章主要介绍了奇怪的默认方法行为与不同的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 ...

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编译器.

解决方法

(回答是基于作者的评论:问题解决了):

做一个完整的清洁和重建也解决了问题.

然而,在某种程度上必然会引起错误的二进制文件.

猜你在找的Java相关文章