2010-10-20 109 views
1

我有三個ClassA ClassB ClassC。所有三個類都實現了「ClassInterface」接口。尋找什麼類型的

class ClassA<T> implements ClassInterface<T>{} 

class ClassB<T> implements ClassInterface<T>{} 

class ClassC<T> implements ClassInterface<T>{} 

我在其他類D類方法:

void methodname(ClassInterface<T> CI[]){} 
在我需要找到哪個類的每個元素都屬於方法

?即CI [i]是否屬於ClassA,ClassB或ClassC?

我試過「instacneof」,但它給了我錯誤。我不知道我的方法是否正確

+3

米奇同意以爲這是個糟糕的設計理念。但'instanceof'應該可以工作。你得到了什麼錯誤? – Thilo 2010-10-20 01:46:40

+2

「instacneof」幾乎聽起來像一個疙瘩治療。你確定你在代碼中拼寫正確嗎? – paxdiablo 2010-10-20 01:58:00

回答

7

這將是一個糟糕的設計理念!你本質上是'上演'。傳遞參數作爲接口的重點在於被調用方法不應該知道或關心實現類是什麼。

+0

同意。有時候,多態的整個觀點似乎通過了一些人:-) – paxdiablo 2010-10-20 01:56:32

4

切換你的觀點,而不是試圖從調用者方法中瞭解類型,給每個類一個不同的實現,並讓他們每個人都有一個專門的行爲。

這意味着實現由ClassA,ClassB和ClassC中的接口聲明的通用方法,並從調用者調用它。

2

確保你沒有試圖模擬你的instanceof檢查模板參數在編譯過程中被「擦除」,所以你沒有訪問它們的instanceof和其他運行時檢查。

但是,你在做什麼通常表明設計不好。

2

泛型使用類型擦除來實現,這意味着ClassInterface<String>ClassInterface<Double>在運行時都只是普通的原始ClassInterface

因此,有這樣的事情是沒有意義的:

if(x instanceof ClassInterface<String>) { 
    // ... do something 
} else if (x instanceof ClassInterface<Double>) { 
    // ... do something else 
}

,因爲在運行時所有的字節碼想說的是

if(x instanceof ClassInterface) { 
    // ... do something 
} else if (x instanceof ClassInterface) { 
    // ... do something else 
}

正如其他海報所說,這種鑄造的是代碼嗅覺表明設計不佳。如果你有一個基於你有其中ClassInterface實施做了一些處理,然後根據您的情況,你應該考慮:

  • 每個子類
  • 應用的接口上定義的方法,做您的具體實現Visitor Pattern到您的界面和實現,以便您可以編寫一個訪問者,無論您需要它自定義處理邏輯
  • 如果你真的想要類型轉換的行爲,那麼你可以使用Super Type Token模式作出決定在類型參數上。這可能是因爲添加一個方法到你的界面簡單是這樣的:Class<T> getType();然後做一個if語句,如:
// I really wouldn't recommend this, but it still is an option... 
if(String.class.equals(x.getType())) { 
    // ... do something 
} else if (Double.class.equals(x.getType())) { 
    // ... do something else 
}