2012-11-15 85 views
3

在Java中,如果我有以下信息:List.class, Map.class, Integer.class,以及某個Object的實例foo。是否有可能將foo轉換爲List<Map<Integer, Integer>>?我想不是因爲刪除類型,而是想知道是否有另一種方法來實現類似的功能。與泛型的協方差鑄造

編輯:提供更多的上下文。我正在編寫一個能夠接受查詢(由對象和度量組成)並輸出所需度量的應用程序。一個例子是「列表中元素的總和」。客戶端需要編寫一個提供程序,嚮應用程序註冊自己,並廣播它能夠爲某種對象類型提供某種度量類型(例如,爲列表求和)。該應用收到查詢後會匹配正確的提供商並調用其上的方法calculate

沒有泛型就很簡單。任何對象實例的規範類型都是它的類。因此,我會將查詢中的對象視爲Object,然後使用它的class,找到能夠提供此對象實例的提供程序。指標類似。

現在介紹泛型...假設我將度量標準f定義爲元素爲Integer時元素的總和,如果元素爲Double則爲元素的和。我需要2個供應商,一個供應List<Integer>,另一個供應List<Double>。但由於類型擦除,我不能直接使用規範類型class。所以我存儲了相關的類(List.classInteger.classList.classDouble.class),並使用類的元組匹配提供者。

因此,在calculate方法中,我需要執行從Object到供應商處理的適當類型的協變變換。

也許我對問題採取了錯誤的方法?

+0

目前還不清楚,如果你的意思是你知道你正在編寫它的列表,地圖和整數代碼,在這種情況下,你可以做一個普通的老演員,或者如果它的三'類'對象你不知道,在這種情況下你是正確的,這是不可能的。 – Affe

+0

請提供更多的語料。誰創建實例'List >'?如果你控制'new'語句,你可以在那裏添加額外的信息,以便這種類型的轉換是可能的。你控制它嗎? – Saintali

+0

查看我的編輯 –

回答

2

你會得到最接近的是這樣的:

List<Map<Integer, Integer>> fooList = List.class.cast(foo); 

這將產生一個編譯器警告,因爲不安全的鑄造和原材料類型的使用,但它實際上是安全的(如果你知道你的對象包含的內容它說它的確如此)。

+0

但是在這種情況下,「傳統」鑄造沒有優勢嗎? – Puce

+1

不,你會使用這個版本,如果你沒有在編譯時的類型 –

+0

@SeanPatrickFloyd thx,我實際上正在做你剛纔提到的。不喜歡編譯器警告,所以想知道是否有其他的方式來做到這一點,我不知道。 –

2

不是沒有得到警告,AFAIK。

List<Map<Integer, Integer>> bar = (List<Map<Integer, Integer>>) foo;