2014-04-02 84 views
6

現在添加到Java 8的默認方法有什麼方法來創建一個默認的構造函數嗎?有沒有辦法給接口添加一個默認的構造函數

我已經試過:

public interface KadContent<T> 
{ 
    public default KadContent() 
    { 

    } 
... 

從NetBeans中

獲取錯誤<identifier> expected爲什麼需要的?我正在使用Gson序列化對象,並得到「無法調用無參數構造函數..」錯誤,我知道我可以使用Gson的InstanceCreator來解決這個問題。但有沒有辦法創建一個默認的構造函數?

更新

我發現我自己的代碼的問題。我用

gson.fromJson(new String(data), InterfaceName.class); 

,而不是

gson.fromJson(new String(data), ClassName.class); 

因此,即使子類有缺省構造函數,反序列化的代碼是不正確的。但是默認構造函數的問題依然存在。

+6

接口不應該有構造函數。它們不是對象創建的一部分。他們應該保持雙方的合同。 –

+2

默認構造函數甚至意味着什麼?它會創建一個實例? –

+0

Gson需要它,這就是我所需要的一切。 –

回答

7

不,這是不可能的。

  1. 它沒有意義在接口
  2. 如果您實現一個接口,在類已經默認構造函數(一個不帶參數)

您可能需要使用抽象類如果你想實現有一個「默認構造函數」。

+0

如果java將有真正的枚舉,我會同意「1.」。但是你不能擴展枚舉,如果你想添加一些功能到你自己的枚舉中,那麼你就會陷入界面。是的,那麼一個默認的構造函數會有意義。當你想要繼承靜態方法時,你會得到同樣的「它沒有任何意義」,這在某些情況下很有意義。 – flaschenpost

+0

問題是根據定義,接口不提供任何功能。當然,自從默認方法以來,這已經有所改變。但是使用默認方法,您無法直接更改對象的狀態。該實現定義了可能的狀態(通過定義成員變量),而不是接口。接口只是指定了什麼出來,什麼出來,而實現的細節委託給實現。因此,提供默認構造函數是沒有意義的,因爲您無法設置或更改其中的任何變量。 – thobens

2

Interface中提供Constructor沒有任何意義。

請檢查是否有意義,以提供默認的initialize()方法。

+0

將此接口類放在堆上時,會自動調用默認的'initialize()'方法嗎? –

+1

沒有,它由你來調用初始化(),例如在工廠 – AlexWien

1

您需要將默認構造函數添加到要序列化的類。

+0

我這樣做,但仍然得到錯誤,想我必須序列化代碼移動到類,而不是接口 –

+0

依賴,如果它作爲一個定製系列化,那麼作爲writeObjectData(DataOutputStream類DOS)和readObjectData() – AlexWien

+0

你記得讓noArg構造函數類的公共接口可以定義methos? – MTilsted

1

構造函數是當物體進入畫面,並且在接口一個對象不能被建造的事實是合理的,是它的Java,C#或Java8

所以......如果您有任何功能,你會想要在接口級別默認定義,Java8引入了Default Methods的概念。

相關問題