奇怪的默认方法行为与不同的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编译器. 解决方法
(回答是基于作者的评论:问题解决了):
做一个完整的清洁和重建也解决了问题. 然而,在某种程度上必然会引起错误的二进制文件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |