2016-09-18 21 views
3

我正在閱讀有關Java 8中的默認方法,而且我陷入了一件事 - 有沒有一種方法可以從界面調用默認方法而不實現它,或者使用動態代理?只用一個簡單的方法,就像下面的方法:如何顯式調用默認方法,沒有反射和動態代理?

interface DefaultTestInterface{ 
    default void method1(){ 
     //default method 
    } 
} 
class ImplementingClass implements DefaultTestInterface{ 
    public void method1(){ 
     //default method invocation in implementing method 
     DefaultTestInterface.super.method1(); 
    } 
    void method2(){ 
     //default method invocation in implementing class 
     DefaultTestInterface.super.method1(); 
    } 
} 
public class Main { 
    public static void main(String[] args) { 
     //is there any way to simply invoke default method without using proxy and reflection? 
    } 
} 

我看過類似的問題,但first在實現方法只調用連接,另外兩個與dynamic Proxy using reflection reflection連接。

這些解決方案相當複雜,我想知道是否有更簡單的方法。我也閱讀了這些文章,但是我沒有找到解決我的問題的方法。我會很感激任何幫助。

+4

所以你想使用一個沒有實例的實例方法??? – fabian

+1

你的問題存在一些困惑。 java 8接口的*默認方法*已經是一個實現。如果您沒有需要不同實現的類特定行爲,則只需實現該接口,然後省略要用作默認的方法。如果您想從* interface *中調用方法,而不是考慮使用* static *關鍵字來定義它,請改爲。 –

+0

沒有@fabian,我正在考慮以某種方式包含實例化的解決方案。 –

回答

6

如果接口只有一個方法,或者它的所有方法都默認實現,所有你需要做的就是創建一個匿名實現,它實現您要呼叫的方法:

(new DefaultTestInterface() {}).method1(); 

Demo.

+0

謝謝,這正是我正在尋找的解決方案。 –

+0

@MichałSzewczyk:你的問題明確地說「*不實施它*」,而這個答案*就是實施它。這根本沒有任何意義。它歸結爲你真的問過「我如何實現一個接口?」...... – Holger

+1

@Holger從技術上講,你是絕對正確的:這*是接口的實現。然而,這種退化的實現看起來並不像一個實現 - 事實上,我確信包括我自己在內的許多程序員不會在粗略閱讀中發現實現。 – dasblinkenlight