【问题标题】:Type mismatch: cannot convert from HashMap<Integer,Item> to HashMap<Integer,Item>类型不匹配:无法从 HashMap<Integer,Item> 转换为 HashMap<Integer,Item>
【发布时间】:2017-10-18 15:01:40
【问题描述】:

我正在尝试在我的 JSP 中使用这段代码来循环遍历 Hashmap。当jsp加载时

    HashMap<Integer, Item> itemsMap = new HashMap<Integer, Item>();
    itemsMap = customer1.getItems();
      for(Map.Entry<Integer, Item> entry:itemsMap.entrySet()){
              Integer k=entry.getKey();
             Item item=entry.getValue();
      }

这是我尝试加载 jsp 时显示的错误

    org.apache.jasper.JasperException: Unable to compile class for JSP: 
    An error occurred at line: 159 in the jsp file: /JSP/cart.jsp
    Type mismatch: cannot convert from HashMap<Integer,Item> to HashMap<Integer,Item>
    156: //   HashMap itemsMap = customer1.getItems();
    157: //          for(Iterator i = itemsMap.keySet().iterator();i.hasNext();){
    158:      HashMap<Integer, Item> itemsMap = new HashMap<Integer, Item>();
    159:      itemsMap = customer1.getItems();
    160:           for(Map.Entry<Integer, Item> entry:itemsMap.entrySet()){
    161:                   Integer k=entry.getKey();
    162:                   Item item=entry.getValue();

当我在 servlet 中出于相同目的使用相同的代码时,它运行良好。 有人能告诉我我在这里做错了什么吗?谢谢。

这些是相关的类:

public class Customer {
    private String name;
    private String address;
    // private ArrayList<Item> items = new ArrayList<Item>();
    private HashMap<Integer,Item> items=new HashMap<Integer,Item>();
    public Customer() {

    }
    public HashMap<Integer,Item> getItems(){ return items;}
}

public static class Item {
    private String name;
    private String skew;
    private String amount;
    public Item(String name, String skew, String amount) {
        this.name=name; this.skew=skew; this.amount=amount;
    }
}

【问题讨论】:

  • 确保您的 Item 类已导入 JSP 并且它是正确的 Item 类。
  • 您可以在您的帖子上更新什么 customer1.getitems 签名
  • @gatisahu 这里是相关类的一些相关信息public class Customer { private String name; private String address; // private ArrayList&lt;Item&gt; items = new ArrayList&lt;Item&gt;(); private HashMap&lt;Integer,Item&gt; items=new HashMap&lt;Integer,Item&gt;(); public Customer(){ } public HashMap&lt;Integer,Item&gt; getItems(){ return items;} }public class Item { private String name; private String skew; private String amount; public Item(String name, String skew, String amount){ this.name=name; this.skew=skew; this.amount=amount; }}

标签: java jsp generics hashmap type-mismatch


【解决方案1】:

根据您使用的应用服务器,您可以检查从 JSP 文件生成的 Java 文件。例如,在 Tomcat 中,它位于“工作”目录树的某个位置。当您在调试器会话中右键单击 JSP 文件并单击上下文菜单中的“显示 Servlet”之类的内容时,某些 IDE 也可以为您打开它。请注意,当您在调试器会话之外时,这将无法正常工作。

打开此文件后,您可以检查导入和其他所有内容以及它无法编译的原因。

用户 Zircon 关于“Item”类型以及它是否是 JSP 中的导入之一的评论可能是正确的。不过,我并不担心缺少导入,而是担心您的应用程序的设计。在 Web 开发中,将业务逻辑和显示逻辑分开是一个非常强大的约定。 换句话说:在任何情况下都不应在 JSP 中包含 Java 代码。所有业务逻辑(这就是您的 Java 代码应该包含的内容)应该封装在控制器和模型中,或者,如果您愿意,可以封装在您从 JSP 中实例化的 bean 中。如果您想迭代某些内容,请使用&lt;c:forEach &gt; 和类似规定。

如果你坚持在 JSP 中使用 Java,那么至少使用菱形运算符:HashMap&lt;Integer, Item&gt; itemsMap = new HashMap&lt;&gt;();

这样问题可能会产生一个更有启发性的编译器或运行时消息。

如果这一切都没有帮助,那么请真正找到应用程序服务器从您的 JSP 创建的 servlet 文件(.java 文件),并将导入部分复制到您的问题中,以便我们知道它正在尝试访问哪种类型的项目。

【讨论】:

  • Container 将 jsp 页面转换为 java servlet (pageName_jsp.java) 您可以直接检查该文件 例如。这是转换后的java文件的路径。 apache-tomcat-7.0.68_eclipse/work/Catalina/localhost//org/apache/jsp/WEB_XXX/pages
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多