【问题标题】:java.util.Vector cannot be cast to java.util.ArrayList - cast List to ArrayListjava.util.Vector 无法转换为 java.util.ArrayList - 将 List 转换为 ArrayList
【发布时间】:2017-10-29 22:10:50
【问题描述】:

我有以下代码

public List<Item> getDbItems()
    {
        ArrayList<Item> dbItems = new ArrayList<>();
        EntityTransaction entr=em.getTransaction();
            entr.begin();
        TypedQuery<Item> query = em.createQuery("SELECT i FROM Item i", Item.class);
        dbItems = (ArrayList<Item>) query.getResultList();
        em.getTransaction().commit();
        return dbItems;
    }

我需要它返回 ArrayList 而不是 Array。是否有返回 ArrayList 的查询?

【问题讨论】:

  • ArrayList 演员阵容有何意义?为什么不使用更明显的(List&lt;Item&gt;)
  • 我需要它来返回 ArrayList - 不,你不需要
  • 我认为这一切都归结为继承 101 和对接口的编码。
  • 更多信息将有助于提供解决方案。
  • 为什么标题中提到了java.util.Vector

标签: java jpa


【解决方案1】:

变化:

dbItems = (ArrayList<Item>) query.getResultList();

到这里:

dbItems = new ArrayList<Item>(query.getResultList());

现在,从设计的角度来看,您的方法的客户应该决定他们想要使用哪种实现,尽可能使用抽象/接口。忘记 ArrayList,只需在查询方法周围使用 List,然后您的方法的客户将不得不决定如何使用该 List 以及他们想要哪种实现。

此外,单个 SELECT 查询不需要事务

public List<Item> getDbItems()
    { 
        TypedQuery<Item> query = em.createQuery("SELECT i FROM Item i", Item.class);
        return query.getResultList();
    }

【讨论】:

    【解决方案2】:

    你必须了解什么是接口和类:

    • 这里的接口是List,它会提供给你一组你可以调用的函数/方法。
    • 您将实例化的类,在本例中为 ArrayList,您告诉您如何为接口 List 提供的方法将被执行,所以现在,对您的代码可以编译,并且运行良好,这样做:

      public List<Item> getDbItems()
      {
          List<Item> dbItems = new ArrayList<>();
          EntityTransaction entr=em.getTransaction();
              entr.begin();
          TypedQuery<Item> query = em.createQuery("SELECT i FROM Item i", Item.class);
          dbItems = query.getResultList();
          em.getTransaction().commit();
          return dbItems;
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2017-06-03
      • 2023-04-07
      • 2015-07-16
      相关资源
      最近更新 更多