2014-09-29 104 views
1

我在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

回答

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的子類,而它又是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

1

您可以通過使用泛型

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

這樣你被編譯器提醒的是,泛型類型必須是一種兼容實現Foo這種類型可能近似於接口這樣的返回類型是Foo本身或實現此接口的任何其他類型。使用時:

class Bar implements Foo<Bar> 

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

相關問題