【问题标题】:Type safety: The expression of type List needs unchecked conversion to conform to List<Object[]>类型安全:类型 List 的表达式需要未经检查的转换才能符合 List<Object[]>
【发布时间】:2015-04-16 20:01:00
【问题描述】:

当我想启动 Hibernate 应用程序时,我总是收到类型安全警告。有没有办法在不使用@SuppressWarnings("unchecked") 的情况下摆脱这种情况?

这是我的代码:

Configuration config = new Configuration();
        config.addAnnotatedClass(Employee.class);
        config.configure("hibernate.cfg.xml");

        new SchemaExport(config).create(false, false);

        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties()).build();
        SessionFactory factory = config.buildSessionFactory(serviceRegistry);

        Session session = factory.getCurrentSession();

        session.beginTransaction();

        Query q = session
                .createQuery("SELECT e.empId,e.empName FROM Employee e");

        @SuppressWarnings("unchecked")
        List<Object[]> list = q.list(); <-- here is the problem!

【问题讨论】:

    标签: java types


    【解决方案1】:

    Hibernate 的 Session.list() 返回一个普通的原始 List

    将其转换为参数化集合是完全合法的 Java 语法(此处为List&lt;Object[]&gt;)。但是由于泛型类型信息在运行时被清除,编译器会发出警告,告诉你它不能保证这个转换实际上是有效的。 所以这只是他告诉你“嘿,你在这里玩火,我希望你知道你在做什么,因为我不知道”的方式。

    在这种特殊情况下,您无法采取任何措施来消除此警告,但您可以使用@SuppressWarnings 注释明确地忽略它。

    【讨论】:

      【解决方案2】:

      另一个重载的createQuery() 方法的接受结果类型。

      createQuery(String queryString, Class<T> resultType)
      

      我不知道是哪个休眠版本添加的。 实际上使用@SuppressWarnings 的结果是一样的。

      List<Employee> emp = session.createQuery("from Employee", Employee.class).getResultList();
      

      顺便说一句,在 Hibernate 5.2 list() 已被弃用。

      【讨论】:

        【解决方案3】:

        不,除非您将 q.list() 完全设为 List&lt;Object[]&gt;,否则无法删除它

        【讨论】:

          【解决方案4】:

          您可以强制强制转换使警告消失,但就像抑制警告一样,它隐藏了一个潜在问题,因为 q.list() 不能保证返回该确切类型。

          List<Object[]> list = (List<Object[]>)q.list();
          

          【讨论】:

          • 我试过了,演员没有删除警告。它只是将警告更改为 Unchecked cast。
          猜你喜欢
          • 2016-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-28
          • 2010-09-26
          • 1970-01-01
          • 2022-02-03
          • 1970-01-01
          相关资源
          最近更新 更多