接口中的内部类必须由“实现者”实现

时间:2011-10-25 15:43:18

标签: java

我有这个界面:

public interface ISectionListItem {
    public int getLayoutId();
    public void setProps(View view, int position);  
}

但我希望实现此接口的所有类都强制在其中包含静态类。我想到了:

 public interface ISectionListItem {
    public int getLayoutId();
    public void setProps(View view, int position);

    static class ViewHolder {};
}

但是,这并没有强制类“添加未实现的内部类”。无论如何要做到这一点?它甚至可能吗?

谢谢:)

3 个答案:

答案 0 :(得分:8)

接口的关键在于您要定义合同,而不是实现。如果你真的需要一个实例,那么你想做一些像

这样的事情
 public ViewHolder getViewHolder();

并定义一个视图符号界面。同样,这个想法是你没有创建一个实现,你正在表达一个合同。

答案 1 :(得分:3)

接口的性质无法做到这一点。接口定义对象的公共行为;如果类实现了接口,则意味着该类的所有实例都遵循接口定义的协定。因此,接口不能包含静态成员。 (这个规则有一个例外,但此时你不应该关心它。)

小心你的术语:静态成员类不是内部类。静态成员类与普通类类似,只是它们位于不同的命名空间中。静态成员类是包含类的实例的成员,就像任何静态类成员不是“实例模板”的一部分一样。根据定义,内部类不是静态的。

那么,为什么我们不能在接口中声明一个真正的(即非静态的)内部类?那是因为在界面中你只能定义对象的行为,而不是它们的组成方式。接口的全部要点(和美)是它们将行为(“ 它做了什么”)与实现分开(“如何完成它”)。因此,您无法在接口中声明内部类,就像您无法在接口中声明字段一样。

我不知道你要做什么,但你可能想尝试以下方法。我们打电话给您的原始界面MyInterface

  1. 定义额外接口SomeType
  2. 让你的内部类实现SomeType
  3. public SomeType getInnerClassInstance()
  4. 中声明MyInterface(一个可怕的方法名称)之类的方法

    请注意,由于MyInterfacegetInnerClassInstance()实例不会强制实际返回内部类的实例。这是一件好事,因为你没有受到特定实现的束缚。

答案 2 :(得分:1)

你不能强迫某人创建一个内部类。

根据您想要做的最好的方法,可能是在接口上添加方法getViewHolder()并创建另一个指定ViewHolder行为的接口。