2014-04-02 43 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的概念。

相关问题