2009-06-24 21 views
1

我有這個簽名的方法:爲什麼返回通用化Map的代碼在分配給通用Map時會生成編譯器警告?

protected final Map<String, Object> buildOutputMappings(
           AbstractDataObject ado, MDBase md) 

而且調用此方法(在子類中):

Map<String, Object> params = buildOutputMappings(ra, md); 

我得到這個編譯器警告:

 Warning:Warning:line (136)[unchecked] unchecked conversion 
found : java.util.Map 
required: java.util.Map<java.lang.String,java.lang.Object> 

更改PARAMS到一個非通用Map去除編譯器警告。爲什麼會這樣以及如何避免(壓制除外)?

編輯:這是JDK 1.5,第136行是上面的賦值語句。 這兩個類都不是參數化的 ,它們只是具有返回泛型類型的Map的方法。方法中的返回對象也是通用化的。

編輯:超類的確是泛化的,雖然返回值與這些泛型沒有任何關係。下面是該方法的代碼,雖然與免責聲明,我沒有寫這篇文章,我知道這是醜陋:

protected final Map<String, Object> buildOutputMappings(AbstractDataObject ado, MDBase md) throws DAOException { 
    try { 
    .... 
    Map<String,Object> params = new HashMap<String, Object>(spc.getNumberInParams()); 
    .... 
    return params; 
    } 
    catch (Exception e) { 
    logger.undeterminedError(e); 
    throw new DAOException(e.getMessage(), e); 
    } 
} 

下面是類聲明:

public abstract class DAOBase<T extends AbstractDataObject> 

public class RoleAssignmentDAO extends DAOBase 
+0

您使用的是什麼版本的Java? – 2009-06-24 17:05:40

+1

什麼是136線?是你展示的這兩個中的一個? – cd1 2009-06-24 17:05:46

+0

這裏沒有任何警告,用Java 5和Java 6測試過 – dfa 2009-06-24 17:08:39

回答

5

我的猜測是,您沒有在子類中正確使用泛型,並且編譯器正在爲該類禁用泛型。因此buildOutputMappings調用的返回類型正在轉換爲原始類型,並且正在生成警告。是參數化的父類嗎?子類是否包含父類參數的類型?

簡而言之,您的錯誤很可能是子類或父類中的某個放置類型參數。

4

我有一種感覺您的實際返回語句與您的方法定義所指示的返回正確類型不匹配。我無法確定,因爲您沒有包含代碼。

相關問題