簡體   English   中英

使用不同Java版本的Strange Default Method行為

[英]Strange Default Method behavior with different Java versions

假設我有以下類層次結構:

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 ...

測試代碼

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編譯器都會出現問題。

(根據上面作者的評論回答:問題解決了):

完全清理和重建也解決了問題。

盡管如此,某些地方肯定有一個錯誤導致了錯誤的二進制文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM