2016-12-19 63 views
-1

比方說,我創建了一個包含公共類Processor的包process,該類包含一個構造函數,該構造函數需要Container<I>類型的參數。類Container<I>位於我無法控制的其他包中,幷包含任意類型的對象I。包含物品的容器在包裝的多個類別之間傳遞process避免通過使用未選中類型轉換製作類的通用

的項目經由接口Processable的方法加工。他們可以通過方法getProcessedItem(Property property)process的用戶檢索。此方法返回一個處理後的項目,其屬性property確保由傳遞的容器包含,因此可以轉換爲容器的類型參數。

例如類:

package process; 

import container.Container; 

public class Processor<I extends Processable> { 
    private final ItemProcessor itemProcessor; 

    public Processor(Container<I> container){  
     this.itemProcessor = new ItemProcessor(container); 
    } 

    @SuppressWarnings("unchecked") 
    public I getProcessedItem(Property property){ 
     return (I)itemProcessor.getProcessedItem(property); 
    } 

} 

它是通常一個好主意,在這樣的情況下未經檢查的類型轉換?

我想通了迄今爲止唯一合理的選擇是讓在包process有抱到參數化的容器的引用(如ItemProcessor)所有類也只是爲了保持在getProcessedItem(Property property)所需要的類型信息的緣故通用。

編輯: 爲了澄清容器類的功能在我的例子:

我想要的容器類來表示一些比較原始的集合類類應該僅僅是有可能使處理器檢索它必須處理的項目。

這意味着通過使用ItemProcessor應該能夠處理加工的物品ItemProcessor和類(一旦被從容器中檢索) ,因爲他們喜歡(例如將其存儲在表或其他數據結構)。最後,應該可以根據某個處理器特定的屬性請求處理的項目。例如:

getProcessedItem(Property.MOST_RECENTLY_PROCESSED) 

像Java的標準集合類(如ArrayListContainer<I>不嚴格保證它只包含I及其後代。這意味着一旦容器的物品被用作Processable,而實際上不是Processable,則會發生轉換異常。

在以上處理器類的版本中,當通過getProcessedItem請求的項目與I(由於未檢查轉換)不兼容時,立即引發異常。而且,如果我做了ItemProcessor通用(ItemProcessor<I>),並作出了getProcessedItem回報我,而不是使用未經檢查的演員,也不例外會在該點拋出。因此,我也不確定是否使用getProcessedItem中的Class<I>對象進行運行時類型檢查會更好。對象必須由調用者作爲參數或通過給定的容器明確地提供服務。我覺得應該不是處理器擔心確保容器中的物品實際上與I兼容,因爲處理器不對給定容器的內容的有效性負責。

+0

好吧,Container容器'只接受'可處理的'及其後裔嗎?如果沒有,也許包裝模板'我'會更好.. –

+0

「像java的標準集合類(例如ArrayList)容器並不嚴格保證它只包含我」當然ArrayList 確實保證? –

+0

'List l = new ArrayList (); l.add(4); \t列表 ls =(列表)l;'給我一個包含整數的字符串列表,例如。 – Calculator

回答

0

我認爲你的SuppressWarnings擊敗了泛型的目的。你應該做的是讓getProcessed項也是通用的。

public class ItemProcessor<I extends Processable> { 
    public I getProcessedItem() { 
     return somethingWhichIsProcessable; 
    } 
0

Class類上有一個cast()方法產生沒有警告......

然而,你的模式是錯誤的。你應該問容器的物品,而不是一個任意的物品處理器。你正在破壞封裝。整個ItemProcessor實際上都聞到了它。你應該考慮一個多態的解決方案,在這個解決方案中,對象是在自己身上行事,而不是一個外部行爲體在外部作用於對象的模型