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

问题描述:

我在Java中创建一个新的接口,并且我想创建一个方法,它返回实现接口的类的相同类型。如何在接口方法中为返回值指定相同的类类型?

例子:

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

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

    } 
} 

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

    } 
} 

我怎样才能做到这一点?

+0

最简单的方法是使用Object和结果取决于实现接口的类... – nem035 2014-09-29 22:55:33

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的子类,而它又是Object的子类。

现在假设你有声明为返回一个号码的方法:

public Number returnANumber() { 
    ... 
} 

的returnANumber方法可以返回一个ImaginaryNumber但不是一个对象。 ImaginaryNumber是一个数字,因为它是Number的一个子类。但是,一个对象不一定是一个数字 - 它可能是一个字符串或其他类型。

您可以覆盖的方法和限定它返回原来的方法的一个子类,如下所示:

public ImaginaryNumber returnANumber() { 
    ... 
} 

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

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

+0

但是任何使用接口的代码仍然会看到'ModelInterface getAll()',而不是精致的类型。所以,除了在方法中稍微改进*(因为返回的对象无论如何都默默无闻),它在上下文中并不是特别有用的特性。 – user2864740 2014-09-29 23:00:28

+0

是的。您提出的问题是OP是否需要引用接口才能返回对实现的引用。 – rgettman 2014-09-29 23:04:48

您可以通过使用泛型

interface Foo<T extends Foo<T>> { 
    T method(); 
} 

这样你被编译器提醒的是,泛型类型必须是一种兼容实现Foo这种类型可能近似于接口这样的返回类型是Foo本身或实现此接口的任何其他类型。使用时:

class Bar implements Foo<Bar> 

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