加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:03:18 所属栏目:Java 来源:网络整理
导读:假设我有以下类层次结构: interface CollectionE{ CollectionE $plus(E element)}interface MutableCollectionE extends CollectionE{ @Override MutableCollectionE $plus(E element)}interface SetE extends CollectionE{ @Override SetE $plus(E element
假设我有以下类层次结构:
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编译器.

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读