有没有一种方法可以向接口添加默认构造函数?

12

随着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);

即使子类有默认构造函数,反序列化代码仍然有误。但默认构造函数的问题仍然存在。


7
接口不应该有构造函数。它们不属于对象创建的一部分,而是为了保持两个参与方之间的契约。 - Abimaran Kugathasan
2
默认构造函数意味着什么?它会创建什么实例? - Jon Skeet
好的,Gson需要它,这就是我需要它的全部原因。 - Joshua Kissoon
这没有意义。我想你需要将一个具体的类传递给InstanceCreator,而不是接口。 - lance-java
我正在尝试在接口中编写一个默认方法来处理序列化/反序列化,或者我应该考虑使用抽象类来代替? - Joshua Kissoon
显示剩余2条评论
5个回答

11

不,这是不可能的。

  1. 在界面中没有意义
  2. 如果您实现一个接口,则该类已经有一个默认构造函数(即不带参数的构造函数)

如果您希望实现具有“默认构造函数”的实现,则可以使用抽象类。


4
如果Java有真正的枚举类型,我会同意“1.”。但是你不能扩展枚举类型,如果你想要为自己的枚举类型添加一些功能,那么你就必须使用接口。而且,是的:这时默认构造函数就有意义了。当你想要继承静态方法时,你会得到同样的“没有意义”的感觉,尽管在某些情况下这是很有意义的。 - flaschenpost
重点是,按照定义,接口不提供任何功能。当然,自从默认方法出现后,这种情况有所改变。但是使用默认方法时,您无法直接更改对象的状态。实现定义了可能的状态(通过定义成员变量),而不是接口。接口只指定输入和输出,而实现细节则委托给实现。因此,在默认构造函数中提供默认值没有意义,因为您无法在其中设置或更改任何变量。 - thobens

2

在接口中提供Constructor是没有意义的。

请检查是否有必要提供一个默认的initialize()方法。


1
当这个接口类被放在堆上时,initialize()方法会自动调用吗? - IgorGanapolsky
1
不,调用initialize()是由你决定的,例如在工厂中。 - AlexWien

2
构造函数是对象出现的时候,接口类型的对象不能被构造的事实是正确的,无论是Java、C#还是Java8。
因此,如果您想要在接口级别上定义任何默认功能,Java8引入了“默认方法”的概念。 点击这里查看更多信息。

1
你需要为想要序列化的类添加默认构造函数。

我已经这样做了,但仍然出现错误,我想我必须将序列化代码移到类而不是接口中。 - Joshua Kissoon
取决于情况,如果它是自定义序列化,则接口可以定义方法为writeObjectData(DataOutputStream dos)和readObjectData()。 - AlexWien
你记得将类中的无参构造函数设置为public了吗? - MTilsted

0

是的,有点可以!你可以这样做:

public interface MyInterface {
  MyInterface NO_OP = new MyInterface() {};
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接