类型不匹配:无法从HashMap <integer,item>转换为HashMap <integer,item>

时间:2017-05-18 16:57:52

标签: java jsp generics hashmap type-mismatch

我试图在我的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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

打开此文件后,您可以检查导入及其他所有内容以及它为什么不能编译。

用户Zircon对类型&#34;项目&#34;的评论以及它是否是JSP中的导入之一可能是正确的。我并不担心缺少导入,而是关于应用程序的设计。它是Web开发中非常强大的惯例,用于分离业务逻辑和显示逻辑。 换句话说:在JSP中没有Java代码的情况。所有业务逻辑(这是您的Java代码应该是什么)应该封装在控制器和模型中,或者,如果您需要,也可以封装在您从JSP中实例化的bean中。如果您想迭代某些内容,请使用<c:forEach >和类似的规定。

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

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

如果这一切都没有帮助,那么请真正找到从JSP创建的app服务器的servlet文件(.java文件),并将导入部分复制到你的问题中,这样我们才能知道它的类型是什么? ; s试图访问。