2014-05-02 40 views
0

我給了一組接口,並且必須創建一個實現這些接口的類,但是,我對引用其他接口的接口的返回類型感到困惑。如果方法返回接口,返回什麼?

//實現下面的類C,以便代碼編譯。沒有任何方法可能返回null。 //如果您願意,您可以定義補充類(內部類或「常規」類)。 //注意C是Object的一個子類,它只實現X和Y--你不能改變它。

abstract class A { 
abstract void q(); 
} 

interface Y { 
int p (int j); 
A me(); 
} 

interface X { 
void m (Object o); 
X n(); 
} 

class C implements X, Y { 
// Write your code here -- make all methods public (otherwise, 
// the compiler will not consider the interfaces to be "implemented")! 

    @Override 
public int p(int j) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public A me() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void m(Object o) { 
    // TODO Auto-generated method stub 

} 

@Override 
public X n() { 
    // TODO Auto-generated method stub 
    return null; 
} 
} 

我想爲具有返回類型接口的方法返回什麼?我很困惑,因爲你不能實例化接口,所以我想返回什麼?

+2

您返回實現接口的類的instanciation。例如,'List'接口由'ArrayList'等實現。如果一個方法返回一個'List',返回一個'ArrayList'是一個有效的解決方案。 – AntonH

+0

雖然我的類沒有實現A類。 – helloMundo

+0

如果您創建了匿名類,則可以提供對接口的引用。 'Runnable run = new Runnable(){}'。您的界面中的方法將存儲在您的變量中。這不是爲一個接口提供插件,而是給你的接口中包含的方法提供一些參考。 –

回答

1

您將需要編寫一個實現接口並返回該類的對象的類。

正如你的問題所說:You may define supplementary classes,所以只需編寫實現這些接口的類即可。在abstract類的情況下,您必須擴展這些類。

class Foo extends A { 
// Override abstract method 
} 

由於類C已經實現了XY,你可以返回C類(new C()),其中需要或者XY的對象。

1

如果您創建一個匿名類,您可以提供對接口的引用。 Runnable run = new Runnable(){}。您的界面中的方法將存儲在您的變量中。這不是爲一個接口提供插件,而是給你的接口中包含的方法提供一些參考。

public Runnable run() { 
    return new Runnable() { 
     public void run() { } 
    }; 
} 

這也適用於抽象類。通常,你不能直接創建一個抽象類new A();的實例,但匿名類允許你創建一個排序的子類,允許你重寫需要一個主體的方法。創建匿名類與在某些方面創建子類很相似。您可以訪問受保護的變量,也可以聲明新的方法。

如果你的接口只包含1種方法,你也cpuld使用Lambda表達式

Runnable run =() -> { 

} 
+0

我創建了一個內部類Z,它擴展了抽象類A,然後在Z的實例中創建並返回它,這似乎工作? – helloMundo

+0

您正在詢問具有接口返回類型的方法。如果你擴展一個類,你繼承它的類型。 'Z類擴展A {}''obj = new Z()'是完全有意義的,所以如果返回類型是A,那麼你可以返回一個Z實例。這也適用於實現它們的接口。我只是展示了當方法返回類型是一個接口時如何返回一個值 –

+1

第一種方法(創建一個匿名類)適用於抽象類和接口。 (但lambda不需要) – ajb

相關問題