比方說,我創建了一個包含公共類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的標準集合類(如ArrayList
)Container<I>
不嚴格保證它只包含I
及其後代。這意味着一旦容器的物品被用作Processable
,而實際上不是Processable
,則會發生轉換異常。
在以上處理器類的版本中,當通過getProcessedItem
請求的項目與I
(由於未檢查轉換)不兼容時,立即引發異常。而且,如果我做了ItemProcessor
通用(ItemProcessor<I>
),並作出了getProcessedItem
回報我,而不是使用未經檢查的演員,也不例外會在該點拋出。因此,我也不確定是否使用getProcessedItem
中的Class<I>
對象進行運行時類型檢查會更好。對象必須由調用者作爲參數或通過給定的容器明確地提供服務。我覺得應該不是處理器擔心確保容器中的物品實際上與I
兼容,因爲處理器不對給定容器的內容的有效性負責。
好吧,Container容器'只接受'可處理的'及其後裔嗎?如果沒有,也許包裝模板'我'會更好.. –
「像java的標準集合類(例如ArrayList)容器並不嚴格保證它只包含我」當然ArrayList 確實保證? –
'List l = new ArrayList(); l.add(4); \t列表 ls =(列表)l;'給我一個包含整數的字符串列表,例如。 –
Calculator