2012-12-21 30 views
18

假設部分通用方法:只接受的我有以下類結構類

class Base {} 
class A extends Base {} 
class B extends Base {} 
class C extends Base {} 

我想寫的方法,接受一個B C而不是實例的實例。
我可以在Java中實現嗎?

我知道這是不是很好的繼承情況(一個應該有不同的公共父從Ç),但我只是好奇的是Java的方式來處理像這樣的情況。

編輯:

我知道,更好的繼承會解決問題。我只是好奇,如果Java有一些標準的機制來解決這個問題。
!!!

回答

3

回答了你的問題是「不,Java沒有處理這樣的的標準方法問題」。如果你有這個問題,那麼你可以在這裏查看其他答案,例如修復繼承或使用巧妙的技巧given by MrSmith42

+0

謝謝你正確和簡單的回答:) –

+4

@MichałHerman是否正確? 17 - 1 ... blimey,這就像在工作。 – NimChimpsky

+0

@NimChimpsky不用擔心,有這樣的事情徽章。 :) – MikeTheLiar

2

您可以使用instanceof檢查對象是特定類型。

更好的想法將是更好的繼承結構,當然。

+0

要清楚:在Java中,'instanceof'適用於子類。也就是說,'C c = new C(); c instanceof B'將返回true。如果你想排除'C',你需要明確檢查它。 (添加一條評論,因爲乍一看這個答案對我來說並不清楚。) –

13

你可以使用一個接口?例如

class Base {} 
interface MyGenericInterface {} 
class A extends Base implements MyGenericInterface {} 
class B extends Base implements MyGenericInterface {} 
class C extends Base {} 

這樣一來,該方法可以接受MyGenericInterface的實施方式,並且由於A和B實現的接口,但C沒有,它將接受A的實例和B而不是C,根據需要。

8

如果事情應該接受AB但不C那麼你應該考慮爲什麼CBase首先繼承。您可以添加繼承了一層額外的:

---Base--- 
    |  | 
--Sub--  C 
|  | 
A  B 

然後,你可以讓你的方法爲只接受Sub類型的對象。 Sub甚至沒有做任何事情,他們都在技術上,也Base

一個更快的解決方案將是一個骯髒的if(arg.instanceof(C))雖然...

8

您可以使用異常在運行時處理:

void genericMethod(Base arg_in) 
{ 
    if(arg_in instanceof C) 
    { 
     throw IllegalArgumentException("C class not accepted."); 
    } 

    ... 
    ... 
} 
8

只是因爲你想有一個類型,層次結構不應改變這樣的方法。 但是你想要這種方法的情況可能表明你應該考慮你的 類型層次結構。

但是,如果你確信你的類型是精心設計的,這個方法是什麼:我想

public class T { 

     public void doSomething(final A a) { 
      doSomthing(a); 
     } 

     public void doSomething(final B b) { 
      doSomthing(b); 
     } 

     private void doSomthing(final Base b) { 

      // Here is the implementation 

     } 

    } 
+0

我不知道你打算用那裏的'final'關鍵詞,但它不會阻止在這個調用中發生擴展轉換現場。由於'C'的每個實例都是'B'的實例,因此總能將'C'的實例傳遞給'doSomething()'方法。 –

+0

你爲什麼認爲「C是B的一個實例」? A,B,C都只能擴展基地 – MrSmith42

+0

'最終'對功能無關。只是我習慣的編碼慣例。 – MrSmith42

2

泛型用於類型安全。期。不要「允許」或「禁止」任意的東西。沒有類型安全的原因允許A和B,而不是C.

相關問題