Java使用接口作为参数覆盖抽象类方法

Jos*_*rín 1 java oop

我有这个抽象类:

public abstract class Foo{
   //some attributes

   public Foo(params){}

   public abstract SomeInterface search(Long id);
   public abstract boolean insert(SomeInterface param);
}
Run Code Online (Sandbox Code Playgroud)

我有以下课程:

public class InterfaceImplementation implements SomeInterface {
  //Some code here
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个Foo实例:

public class Bar extends Foo{

  public Foo(params){
    super(params);
  }

  @Override
  public InterfaceImplementation search(Long id){
    // some code here
  }
  // The above code compiles

  @Override
  public boolean insert(InterfaceImplementation param){
    // some code specific to the InterfaceImplementation here
  }
  // This function does not compile/
}
Run Code Online (Sandbox Code Playgroud)

那么,我做错了什么,我怎样才能实现我想做的事情呢?

rge*_*man 5

您的类Bar不会覆盖insert,因为参数类型必须完全匹配.这是因为你的实现需要一个InterfaceImplementation而不是一个SomeInterface.

你可以做些什么来编译它:

  1. 以一个SomeInterface作为参数Barinsert方法,因为任何子类必须能够处理任何执行SomeInterface,如规定Foo.

要么

  1. 引入泛型SomeInterface来指定参数类型应该是什么.

    public abstract class Foo<T extends SomeInterface>{
    
    Run Code Online (Sandbox Code Playgroud)

public abstract boolean insert(T param);
Run Code Online (Sandbox Code Playgroud)

然后你可以指定T子类中的内容:

public class Bar extends Foo<InterfaceImplementation>{
Run Code Online (Sandbox Code Playgroud)

@Override
public boolean insert(InterfaceImplementation param){
Run Code Online (Sandbox Code Playgroud)