为什么返回通用化Map的代码在分配给通用Map时会生成编译器警告?

Yis*_*hai 1 java generics

我有一个带有此签名的方法:

   protected final Map<String, Object> buildOutputMappings(
                                 AbstractDataObject ado, MDBase md)
Run Code Online (Sandbox Code Playgroud)

并使用此方法调用(在子类中):

   Map<String, Object> params = buildOutputMappings(ra, md);
Run Code Online (Sandbox Code Playgroud)

我得到这个编译器警告:

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

将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);
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是类声明:

public abstract class DAOBase<T extends AbstractDataObject>

public class RoleAssignmentDAO extends DAOBase
Run Code Online (Sandbox Code Playgroud)

jam*_*mes 5

我的猜测是你没有在子类中正确使用泛型,并且编译器正在禁用该类的泛型.因此,buildOutputMappings调用的返回类型将转换为原始类型,并且正在生成警告.是参数化的父类?子类是否包含父类参数的类型?

简而言之,您的错误很可能是子类或父类中某处的删除类型参数.