2012-12-11 284 views
2

在抽象工廠模式中,我使用的是泛型。 我有擴展Serializable的BaseEntity接口,Employee類實現BaseEntity。 在抽象類我有這個getJavaObj方法泛型類型鑄造?

getJavaObj()是取Long empId的方法,並返回一個Map<String, ? extends BaseEntity>

public abstract Map<String, ? extends BaseEntity> getJavaObj(Long id); 

使用泛型我試圖做到這一點在它給人的主類;

Map<String, Employee> emp = getJavaObj(empId); 

它給這個錯誤類型安全:從Map<String,capture#1-of ? extends BaseEntity>未經檢查的強制轉換爲地圖

當我做類型轉換這樣

Map<String, Employee> emp = (Map<String, Employee>)getJavaObj(empId); 

它給出了這樣的警告

類型安全:未選中投自Map<String,capture#1-of ? extends Serializable>至 地圖 類型安全:未選中從Map<String,capture#1-of ? extends BaseEntity>轉換爲 地圖

有沒有辦法避免類型轉換或解決警告甚至類型轉換後?由於我要返回的對象通過BaseEntity接口擴展到Serializable。

回答

2

重新定義你的工廠方法:

public abstract <T extends BaseEntity> Map<String, T> getJavaObj(Long id); 

然後你就可以得到正確的類型背不進行強制轉換:

Map<String, Employee> emp = getJavaObj(empId); 
+0

不能他們只是一個泛型類型ARG添加到方法,而不是類參數?正如'public abstract Map getJavaObj(Long id)'?或者我忘了一些關於泛型方法參數的重要內容? –

+0

@TomG - 這也可以。我認爲T已經是一個類參數。發佈作爲答案,它可能會得到一個綠色的複選標記。 :) –

+0

@TedHopp在抽象類中,它不允許按照你的建議。它提供了錯誤,並建議:多標記在該行 \t - 類型參數字符串是隱藏式 \t字符串 \t - 這種方法需要一個機構,而不是一個 \t分號 \t - 返回類型的方法缺少 \t - 令牌上的語法錯誤「擴展」,預期爲 –