2015-07-03 77 views
0

匿名類只能從一個類或接口擴展,所以我不能做下:爲什麼匿名類不能實現兩個分離的接口,但可以實現內部接口?

interface Enjoyable { 
    public void enjoy(); 
} 

interface Exercisable { 
    public void exercise(); 
} 

public class Test { 
    public static void main(String[] args) { 
     new Enjoyable implements Exercisable() { 
      public void enjoy() { 
       System.out.println(":D"); 
      } 
     }.enjoy(); 

    } 
} 

它說:

Enjoyable.Exercisable不能被解析爲一個類型

我試圖複製這種行爲,我寫了下面的代碼:

interface Enjoyable { 
    interface Exercisable { 
     public void exercise(); 
    } 
    public void enjoy(); 
} 

public class Test { 
    public static void main(String[] args) { 
     new Enjoyable.Exercisable() { 
      public void enjoy() { 
       System.out.println(":D"); 
      } 

      public void exercise() { 
       System.out.println("Doing exercise !!!"); 

      } 
     }.exercise(); 

     new Enjoyable.Exercisable() { 
      public void enjoy() { 
       System.out.println(":D"); 
      } 

      public void exercise() { 
       System.out.println("Doing exercise !!!"); 

      } 
     }.enjoy(); 

    } 
} 

然後我得到:

做運動!!! :D

是否有另一種方法來模擬它? 而我的方式我hace實施兩個metods un匿名類?

感謝

+0

在你的第二個片段中,你的匿名類正在實現'Exercisable',而不是'Enjoyable'。 –

+0

這並不完全清楚你在問什麼。 – rodit

+0

我想要一個匿名類誰實現2接口方法 –

回答

2

你的練習的不愉快:-) 這種嵌套接口並不意味着內部接口是 的外部接口類型!

你也可以同樣寫了類似

new Object() { 
      public void enjoy() { 
       System.out.println(":D"); 
      } 

      public void exercise() { 
       System.out.println("Doing exercise !!!"); 

      } 
     }.enjoy() 
// same for .excercise() 

這樣你就不會真正模擬實現兩個接口,一個匿名類。

你可以看到這個當你真正嘗試到您的匿名實例分配給一個類型的接口中的一個變量

// this WILL NOT COMPILE ! 
Enjoyable enjoyable=new Enjoyable.Exercisable() { 
      public void enjoy() { 
       System.out.println(":D"); 
      } 

      public void exercise() { 
       System.out.println("Doing exercise !!!"); 

      } 
     }.enjoy(); 

你當然可以這樣做:

interface Enjoyable { 
    public void enjoy(); 
} 

interface Exercisable extends Enjoyable { 
    public void exercise(); 
} 

和然後使用這些接口創建匿名實例 不幸的是,創建一個匿名實例來實現兩個接口,就像你試圖做的那樣是不可能的。

+0

但爲什麼你必須同時實現匿名類型的方法嗎? –

+0

@ Alejandro Agapito Bautista ..對不起,我不太清楚如何理解你的評論...我在例子中實現了這兩種方法,因爲我只是採用了你的代碼......當然在第一個例子中實現'excercise'是多餘的 –

3

我想誰實現了2層接口的方法

我假定你的意思是你想它實現了兩個接口的匿名類匿名類。你不能,直接。

你可以做

interface EnjoyableAndExercisable extends Enjoyable, Exercisable { 
} 

,然後創建一個實現該匿名類。

EnjoyableAndExercisable o = new EnjoyableAndExercisable() { 
    @Override 
    public void enjoy() { 
     System.out.println(":D"); 
    } 
    @Override 
    public void exercise() { 
     System.out.println("Doing exercise !!!"); 

    } 
}; 

請注意@Override這將永遠驗證您是否實際上是否覆蓋方法。

然而,在你的代碼,這個匿名類

new Enjoyable.Exercisable() { 
    public void enjoy() { 
     System.out.println(":D"); 
    } 

    public void exercise() { 
     System.out.println("Doing exercise !!!"); 

    } 
}.enjoy(); 

只是Exercisable的實現。您只需在其中聲明一個名稱爲enjoy的方法。

你不能把它分配給Enjoyable

Enjoyable ref = new Enjoyable.Exercisable() { 
    public void enjoy() { 
     System.out.println(":D"); 
    } 

    public void exercise() { 
     System.out.println("Doing exercise !!!"); 

    } 
}; // nope, compile time error 

類型的變量只能調用該方法在聲明該匿名類型的新實例創建表達式。您不能以任何其他方式調用它(因爲它是以匿名類型聲明的)。

0

您可以創建基於非final類或接口的匿名內部類與

new Exerciseable(){ 
... 
} 

然而,Java不允許

new Object() implements Exercisable{ 
... 
} 

new Object implements Exercisable(){ 
... 
} 

的匿名內部類使用new關鍵字生成一個超類的新實例是Object並執行Exercisable。 JCP的站點提供的文件(https://jcp.org/aboutJava/communityprocess/maintenance/JLS/innerclasses.pdf),屬於JSL關於內部類它說:

正如已經暗示,如果一個匿名類是從一個接口 我得到的,實際的超類對象,並且類實現我寧可 比延長它。 (Explicit implements子句是非法的。)這是 接口名稱可以合法地遵循關鍵字new的唯一方法。在這種情況下,參數列表必須始終爲空,以匹配實際超類Object的構造函數 。

你的第二個例子構造了一個類型Exercisable,它擴展了Enjoyable。再次創建該接口的匿名類是合法的。

相關問題