微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

奇怪的默认方法行为与不同的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编译器.

解决方法

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

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

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

原文地址:https://www.jb51.cc/java/123658.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐