2012-07-12 76 views
3

我想知道是否可以將一個參數設置爲一個對象,該對象必須是一個擴展類並實現另一個。這裏是一個例子:假設我有一個名爲ClassA的類和一個名爲MyInterface的接口。Java - 將參數設置爲對象,它既擴展了一個對象又實現了一個接口

public class ClassA { 
    /* code */ 
}  


public interface MyInterface { 
    /* code */ 
} 

讓我們說別的地方有一個叫做ClassB的類,它既擴展了ClassA又實現了MyInterface。

public class ClassB extends ClassA implements MyInterface { 
    /* code */ 
} 

我也可以有一個ClassC,這也延伸ClassA和實現MyInterface的:

public class ClassC extends ClassA implements MyInterface { 
    /* code */ 
} 

我的問題是這樣的:

比方說,我有一個名爲方法1方法,在方法1我想要一個接受Object的參數。比方說,我想讓這個Object或者繼承ClassA,或者實際上是ClassA本身。這是很容易做到:

public void method1(ClassA parameter) { 

} 

比方說,我也想一個方法2,在方法2我想有它接受任何一個實現MyInterface的一個參數。再次,這是簡單的:

public void method2(MyInterface parameter) { 

} 

但是,如果我想要一個方法3是什麼,我想有一個參數,它僅接受對象,其無論是子類ClassA的或者是ClassA的本身,並實現MyInterface的,所以都接受ClassB和ClassC,但不是任何只擴展ClassA的類,或者只實現MyInterface的類。像:

public void method3 ([Something that extends ClassA implements MyInterface] parameter) { 
    /* code */ 
} 
+0

你不應該。你應該弄清楚你需要的功能,把它封裝在一個類型中,並且需要一個這種類型的對象(無論是類還是接口)。如果其中任何一個足夠好,那麼這意味着它們共享一些共同點,這就是你的參數應該捕捉。 – dlev 2012-07-12 18:28:53

+0

謝謝,dlev。你提出了一個非常好的觀點 - 這看起來似乎更合理,所以我會盡力而爲。 – 2012-07-12 22:26:59

回答

18

你可以做到以下幾點:

public <A extends ClassA & MyInterface> void method3(A parameter) { ... } 

但我不認爲這是一個好主意 - 如果你有一個擴展ClassA並實現MyInterface對象的概念,這將是最好創建一個單獨的類或接口來表示該概念。

+0

偉大而明確的答案! – Pooya 2012-07-12 18:57:05

+0

這是一個好主意。爲什麼我沒有想到這一點?非常感謝!有趣的是,看到它實際上可能有一個這樣的概念作爲參數,我沒有意識到你可以這樣做。但是你犯了一個小錯誤......你寫了「空白」兩次,第一次不應該在那裏 – 2012-07-12 22:28:45

+1

我很感謝你給出了一個可行的答案,即使你覺得不同的方法會更聰明。 – Erhannis 2013-09-04 11:42:44

0

從你的描述看來,好像你需要另一種類型的對象。一個延伸ClassA 的實現MyInterface。也許,即使這是一個抽象類。

然後我會使用這個新對象作爲method3的參數類型。

+0

謝謝你。這更有意義。爲什麼我沒有想到這一點!無論如何,感謝您的信息! – 2012-07-12 22:33:17

相關問題