当前位置: 首页 > 面试题库 >

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

羊光辉
2023-03-14
问题内容

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

   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>

将参数更改为未生成的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

问题答案:

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

简而言之,您的错误很可能是在子类或父类中某个位置删除了类型参数。



 类似资料:
  • 我正在尝试为创建一个通用行映射器。 因此,我的初始片段如下所示: 但是在构造函数中,getComponentType()返回null,因此clazz=null 我无法取得任何进展。 我做错了什么? 谢谢

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!

  • Java在Map接口中提供了通用支持。 语法 (Syntax) Set<T> set = new HashSet<T>(); 哪里 set - Set Interface的对象。 T - 在set声明期间传递的泛型类型参数。 描述 (Description) T是传递给通用接口Set及其实现类HashSet的类型参数。 例子 (Example) 使用您选择的任何编辑器创建以下Java程序。 pa

  • 我对构建哈夫曼编码原型感兴趣。为此,我想首先生成一个组成输入Java字符串的字符直方图。我在SO和其他地方看到了许多解决方案(例如:这里依赖于使用流的方法以及函数的静态导入。identity()和收集器。以非常具体和直观的方式计数()。 但是,当使用与我上面链接的代码非常相似的一段代码时: 我从Intellij收到一个编译时错误,它告诉我没有符合供应商类型的参数来收集,这是其签名所要求的: 不幸的

  • 怎么做?没有找到可以基于类型动态映射的示例。我发现这种方法在、Google中都非常方便。感谢你的帮助!

  • 我想询问一个人,并得到以下回应: 但在需要时,我还想包含字段,并获得如下内容: 但是,我得到的只是手机ID,就像这样: 这是两个有问题的领域: