没有实现所有的接口方法。可能吗?


Answers:


63

解决此问题的唯一方法是将您的类声明为,abstract然后将其留给子类以实现缺少的方法。但是最终,链中的某个人必须实现它才能满足接口合同的要求。如果您确实不需要特定的方法,则可以实现它,然后要么实现它,要么return抛出某种形式的NotImplementedException,这取决于您的情况。

接口还可以将某些方法指定为“默认”,并在接口定义(https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)中提供相应的方法实现。在实现接口时,无需提及这些“默认”方法。


4
我有一个后续问题。我一直只实现使用排序对象compare()Comparator接口功能Arrays.sort()。但是现在打开Javadoc,我看到那里定义了更多的方法。那我怎么能做到这一点呢?
约翰·雷德

1
@JohnRed再看一下该Javadoc。除了“比较”和“等于”之外,每个方法都标记为staticdefault。并且“等于”的文档还提到“请注意,始终不要覆盖Object.equals(Object)始终是安全的。”
锡精灵

@TinWizard是否“安全”-不会引发编译时错误-不重写Comparator合同中的equals或从Object隐式继承的类(实现Comparator的类),因此equal方法实现已在其中”暗中”?
veritas


16

我们可以覆盖abstract父类中的所有接口方法,而在子类中仅覆盖该特定子类所需的那些方法。

接口

public interface MyInterface{
    void method1();
    void method2();
    void method3();
}

抽象父类

public abstract class Parent implements MyInterface{
@Override
public void method1(){

}
@Override
public void method2(){

}
@Override
public void method3(){

}
}

在您的儿童班

public class Child1 extends Parent{
    @Override
    public void method1(){

    }
}




public class Child2 extends Parent{
    @Override
    public void method2(){

    }
}


4

将该类定义为一个abstract类。但是,要创建实例时,必须实现这些未实现的方法(使用子类或匿名类)。


3

如果要实例化的类,则不可能。不过,您可以尝试定义一个abstract类。


3

这是可能的,而且很容易。我编写了一个示例

您要做的就是从实现该方法的类继承。如果您不介意无法实例化的类,则还可以定义一个abstract类。


这意味着它们已经实现。
托尼·霍普金森

1
@TonyHopkinson它们已实现,但不在类中。
emory

6
是的,但是问题是如何不执行而不是在其他地方实现。
托尼·霍普金森

3

您可以在Java8中做到这一点。Java 8引入了“默认方法”或(Defender方法)新功能,该功能使开发人员可以在不破坏这些接口的现有实现的情况下向接口添加新方法。

它提供了灵活性,允许Interface定义实现,在具体的Class无法为该方法提供实现的情况下,它将默认使用该实现。

interface OldInterface {
    public void existingMethod();

    default public void DefaultMethod() {
        System.out.println("New default method" + " is added in interface");
    }
}
//following class compiles successfully in JDK 8
public class ClassImpl implements OldInterface {
    @Override
    public void existingMethod() {
        System.out.println("normal method");

    }
    public static void main(String[] args) {
        ClassImpl obj = new ClassImpl ();
        // print “New default method add in interface”
        obj.DefaultMethod(); 
    }
}

1

如果您尝试实现一个接口并且发现自己处在不需要实现所有接口的情况下,那么这就是代码的味道。这表明设计不好,违反了Liskov替代原则。这通常是由于使用胖接口而发生的

有时也会发生这种情况,因为您尝试从外部依赖项实现接口。在这种情况下,我总是查看源代码,以查看该接口是否有任何实现,可以直接使用它,也可以将其子类化并覆盖需要的方法。


1

我们可以使用Adapter类,它通过不强制执行接口中存在的所有方法来降低复杂性

适配器类是一个简单的Java类,仅使用EMPTY实现来实现接口。如果我们扩展Adapter类,则不执行接口,而是仅为require方法提供实现

例如,如果我们扩展GenericServlet(AC)而不是实现Servlet(I),那么我们将提供Service()方法的实现,而我们不需要为剩余的方法提供实现。

泛型类充当Servlet(I)的ADAPTER类。


0

是的,下面显示的是可能的方法

interface Test {
   void m() throws NullPointerException;
}
class Parent {
   // Parent class doesn't implements Test interface
   public void m() {
      System.out.println("Inside Parent m()");
   }
}
class Child extends Parent implements Test {
}
public class Program {
   public static void main(String args[]) {
      Child s = new Child();
      s.m();
   }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.