如何在接口方法中为返回值指定相同类型的类?

时间:2014-09-29 22:53:46

标签: java interface

我在Java中创建一个新接口,我想创建一个返回实现该接口的类相同类型的方法。

示例:

public interface ModelInterface {
    public (TypeOfClass) getAll();
}

public class Object1 implements ModelInterface {
    public Object1 getAll(){

    }
}

public class Object2 implements ModelInterface {
    public Object2 getAll(){

    }
}

我如何才能做到这一点?

2 个答案:

答案 0 :(得分:3)

Java具有协变返回类型的特性。这意味着子类可以在覆盖/实现方法时指定方法的返回类型的子类。它就像

一样简单
public interface ModelInterface {
    public ModelInterface getAll();
}

public class Object1 implements ModelInterface {
    public Object1 getAll(){
        // implement here
    }
}

public class Object2 implements ModelInterface {
    public Object2 getAll(){
        // implement here
    }
}

This tutorial提供了协变返回类型的解释。

  

假设您有一个类层次结构,其中ImaginaryNumber是java.lang.Number的子类,而java.lang.Number又是Object的子类。

     

现在假设您有一个声明返回Number的方法:

public Number returnANumber() {
    ...
}
     

returnANumber方法可以返回ImaginaryNumber而不是Object。 ImaginaryNumber是一个数字,因为它是Number的子类。但是,Object不一定是Number - 它可以是String或其他类型。

     

您可以覆盖方法并定义它以返回原始方法的子类,如下所示:

public ImaginaryNumber returnANumber() {
    ...
}
     

这种称为协变返回类型的技术意味着允许返回类型在与子类相同的方向上变化。

     

注意:您还可以使用接口名称作为返回类型。在这种情况下,返回的对象必须实现指定的接口。

答案 1 :(得分:1)

您可以使用泛型

在界面中近似这种返回类型
interface Foo<T extends Foo<T>> {
  T method();
}

这样编译器会提醒您,泛型类型必须与实现Foo的类型兼容。此类型可能是Foo本身或实现此接口的任何其他类型。使用时:

class Bar implements Foo<Bar>

然而,所有方法都被迫按预期返回Foo