2017-07-06 78 views
1

我有以下的類和接口的Java:變量需要類和接口

interface R 
class A extends Component implements R 
class B extends JButton implements R 
class C extends JPanel implements R 
class D extends xyz (that extends Component) implements R 

所以我有幾類,所有擴展某種成分的(或多或少直接),並且都實現R.

於是我有了一個需要這樣的工作變量和方法不同等級F:

public class F { 

    public TYPE myVariable; 

    public myMethod void (TYPE argument) { 
    //...code... 
    myVariable = argument; 
    actionThatRequiresComponent(argument); 
    argument.actionDefinedInR(); 
    //...code... 
    } 

    public anotherMethod void() { 
    //...code... 
    myMethod(myVariable); 
    //...code... 
    } 
} 

的問題是,這種類型必須滿足兩個質量要求:它是T o是任何類型的組件,並且必須實現接口R.因此該變量具有相同的要求。

我不確定採取哪種方法?我應該做一些擴展Component的抽象類,實現R?我應該跳過接口R的需求,並試着用try catch嗎?我可以使用泛型類嗎?當涉及到變量時,我該怎麼做? 有什麼建議嗎?

+2

您是否嘗試過聲明的泛型類型'T'的''? – khelwood

+0

我不明白。 –

+0

「action」定義來自哪裏?它是「R」的一部分嗎?如果是這樣,是'R'通用接口? – RealSkeptic

回答

0

如果你想寫一個接受必須擴展Component並實現R參數的方法,你可以做這樣的:

public <T extends Component & R> void myMethod(T item) { 
    ... 
} 

那麼你應該能夠進入你的方法,其任何參數類型擴展/實現您指定的類型。

https://docs.oracle.com/javase/tutorial/java/generics/bounded.html

+0

感謝您的回答 - 至少它表明了我,我一直走在正確的道路上。這是我已經嘗試過的。但首先,我被告知,「即時」定義類型是不好的編程(雖然我沒有給出它是編程不好的原因),其次,我有一個問題,我不知道如何定義變量一樣的方法。正如我上面寫的,我也需要這種類型的變量。我不能寫公開 myVariable = new C(); –

+0

爲什麼你需要聲明一個這樣的變量?你可以聲明'C myVariable = new C();'如果'C'是它的具體類型。 – khelwood

+0

我需要存儲用於調用該方法的變量。所以我有一個變量myVariable首先是空的。在我用任何類型的組件(實現R)調用myMethod之後,我會將該參數存儲到myVariable。我也無法從類型對象中創建myVariable,因爲該變量可能會再次用於該方法。 –