我有这个界面:
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 {};
}
但是,这并没有强制类“添加未实现的内部类”。无论如何要做到这一点?它甚至可能吗?
谢谢:)
答案 0 :(得分:8)
接口的关键在于您要定义合同,而不是实现。如果你真的需要一个实例,那么你想做一些像
这样的事情 public ViewHolder getViewHolder();
并定义一个视图符号界面。同样,这个想法是你没有创建一个实现,你正在表达一个合同。
答案 1 :(得分:3)
接口的性质无法做到这一点。接口定义对象的公共行为;如果类实现了接口,则意味着该类的所有实例都遵循接口定义的协定。因此,接口不能包含静态成员。 (这个规则有一个例外,但此时你不应该关心它。)
小心你的术语:静态成员类不是内部类。静态成员类与普通类类似,只是它们位于不同的命名空间中。静态成员类是包含类的实例的不成员,就像任何静态类成员不是“实例模板”的一部分一样。根据定义,内部类不是静态的。
那么,为什么我们不能在接口中声明一个真正的(即非静态的)内部类?那是因为在界面中你只能定义对象的行为,而不是它们的组成方式。接口的全部要点(和美)是它们将行为(“ 它做了什么”)与实现分开(“如何完成它”)。因此,您无法在接口中声明内部类,就像您无法在接口中声明字段一样。
我不知道你要做什么,但你可能想尝试以下方法。我们打电话给您的原始界面MyInterface
。
SomeType
SomeType
public SomeType getInnerClassInstance()
MyInterface
(一个可怕的方法名称)之类的方法
醇>
请注意,由于MyInterface
,getInnerClassInstance()
实例不会强制实际返回内部类的实例。这是一件好事,因为你没有受到特定实现的束缚。
答案 2 :(得分:1)
你不能强迫某人创建一个内部类。
根据您想要做的最好的方法,可能是在接口上添加方法getViewHolder()
并创建另一个指定ViewHolder行为的接口。