有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

接口中必须由“实现者”实现的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) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    由于接口的性质,这是不可能的。接口定义对象的公共行为;如果一个类实现了一个接口,这意味着该类的所有实例都遵守接口定义的约定。因此,接口不能包含静态成员。(这条规则有一个例外,但在这一点上你不应该在意。)

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

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

    我不知道你想做什么,但你可能想试试下面的方法。让我们调用原始接口MyInterface

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

    请注意,MyInterface实例并不是因为getInnerClassInstance()而被迫实际返回内部类的实例。这是一件好事,因为您不必绑定到特定的实现

  3. # 3 楼答案

    接口的要点是定义的是契约,而不是实现。如果您真的需要一个实例,那么您应该执行以下操作

     public ViewHolder getViewHolder();
    

    并定义一个viewholder界面。同样,这个想法是,你不是在创建一个实现,而是在表达一个契约