如何在接口方法中为返回值指定相同的类类型?
我在Java中创建一个新的接口,并且我想创建一个方法,它返回实现接口的类的相同类型。如何在接口方法中为返回值指定相同的类类型?
例子:
public interface ModelInterface {
public (TypeOfClass) getAll();
}
public class Object1 implements ModelInterface {
public Object1 getAll(){
}
}
public class Object2 implements ModelInterface {
public Object2 getAll(){
}
}
我怎样才能做到这一点?
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() { ... }
这种技术,称为协变返回类型,意味着返回类型是允许在改变与子类相同的方向。
注意:您也可以使用接口名称作为返回类型。在这种情况下,返回的对象必须实现指定的接口。
但是任何使用接口的代码仍然会看到'ModelInterface getAll()',而不是精致的类型。所以,除了在方法中稍微改进*(因为返回的对象无论如何都默默无闻),它在上下文中并不是特别有用的特性。 – user2864740 2014-09-29 23:00:28
是的。您提出的问题是OP是否需要引用接口才能返回对实现的引用。 – rgettman 2014-09-29 23:04:48
您可以通过使用泛型
interface Foo<T extends Foo<T>> {
T method();
}
这样你被编译器提醒的是,泛型类型必须是一种兼容实现Foo
这种类型可能近似于接口这样的返回类型是Foo
本身或实现此接口的任何其他类型。使用时:
class Bar implements Foo<Bar>
然而,所有的方法都被迫按预期返回Foo
。
最简单的方法是使用Object和结果取决于实现接口的类... – nem035 2014-09-29 22:55:33