2014-03-25 81 views
2

我與Java 8擺弄,並來到了下面的代碼在我看來可能工作:在接口從默認的方法內訪問超級方法

class UnrelatedClass implements UnrelatedInterfaceDefault { 
    @Override 
    public void unrelate2() { 
     System.out.println("Unrelated"); 
    } 
} 

interface UnrelatedInterfaceDefault extends UnrelatedInterfaceOne, UnrelatedInterfaceTwo { 
    default public void unrelate() { 
     UnrelatedInterfaceOne.super.unrelate2(); 
     UnrelatedInterfaceTwo.super.unrelate2(); 
    } 
} 

interface UnrelatedInterfaceOne { 
    public void unrelate2(); 
} 

interface UnrelatedInterfaceTwo { 
    public void unrelate2(); 
} 

UnrelatedInterfaceOne.super.unrelate(),我得到的錯誤:

abstract method unrelate2() in UnrelatedInterfaceOne cannot be accessed directly. 

但考慮我是否創建一個實現UnrelatedInterfaceDefault一類的話,我其實有實現的UnrelatedInterfaceOneUnrelatedInterfaceTwo,所以它可以工作?

爲什麼在這種情況下會出現這個特定的編譯器錯誤?

+0

爲了使您的工作如預期,你可以使用強制類型轉換爲相應的接口,而不是調用超。例如。 '((UnrelatedInterfaceOne)此).unrelate2();' – Balder

回答

4

這是失敗的,因爲您的接口中的方法是abstract。如果你製作了default,那麼我猜它會編譯。儘管我現在無法測試它。

JLS §15.12.3 - Compile-Time Step 3: Is the Chosen Method Appropriate?

If the form is TypeName . super . [TypeArguments] Identifier , then:

  • It is a compile-time error if the compile-time declaration is abstract.

還要注意的是,使用super方法的調用從未通過動態調度去。它不會調用重寫的方法,而只會調用super類中定義的方法,或者在此情況下調用TypeName

0

我試着讓你的例子工作。

正如@Rohit Jain所述,我需要改變abstract-> default。然後我有diamond probleminterface UnrelatedInterfaceDefault的權利。我用空方法解決了它。 就是這樣,它的工作原理。至於我,結果是合乎邏輯的)請參見下面

public class Main { 

    public static void main(String[] args) throws IOException, Exception { 
     UnrelatedClass uc = new UnrelatedClass(); 
     uc.unrelate2(); 
     uc.unrelate(); 
    } 
} 

class UnrelatedClass implements UnrelatedInterfaceDefault { 

    @Override 
    public void unrelate2() { 
     System.out.println("Unrelated"); 
    } 
} 

interface UnrelatedInterfaceDefault extends UnrelatedInterfaceOne, UnrelatedInterfaceTwo { 

    @Override 
    public default void unrelate2() { 
    } 

    default public void unrelate() { 
     UnrelatedInterfaceOne.super.unrelate2(); 
     UnrelatedInterfaceTwo.super.unrelate2(); 
     unrelate2(); 
    } 
} 

interface UnrelatedInterfaceOne { 

    public default void unrelate2() { 
     System.out.println("relatedOne"); 
    } 
} 

interface UnrelatedInterfaceTwo { 

    public default void unrelate2() { 
     System.out.println("relatedTwo"); 
    } 
} 

輸出:

Unrelated 
relatedOne 
relatedTwo 
Unrelated