2016-10-01 146 views
-2

我的项目中有一个Customer对象,它扩展了User对象。为什么我会收到此投射错误?

User.java

public class User { 

private int userId; 
private int user_type; 
private String username; 
private String password; 

public User(int id, int user_type, String username, String password) { 
    super(); 
    this.userId = id; 
    this.user_type = user_type; 
    this.username = username; 
    this.password = password; 
} 

public int getUserId() { 
    return userId; 
} 
public void setUserId(int userId) { 
    this.userId = userId; 
} 

public int getUser_type() { 
    return user_type; 
} 

public void setUser_type(int user_type) { 
    this.user_type = user_type; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

} 

和我Customer.java

public class Customer extends User{ 

private String cartId; 

public Customer(int id, int user_type, String username, String password) { 
    super(id, user_type, username, password); 
    // TODO Auto-generated constructor stub 
} 

public String getCartId() { 
    return cartId; 
} 

public void setCartId(String cartId) { 
    this.cartId = cartId; 
} 
} 

现在,我创建了自己的网站一个简单的登录,用户的首先检查存在,如果有,它检查如果它是一个客户或来自管理层。如果它是一个客户,我有一个获取其购物车ID的方法。然后我将用户转换为客户类型,然后通过设置器设置购物车ID。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    String username = request.getParameter("username"); 
    String password = request.getParameter("password"); 
    boolean userDoesNotExist = false; 

    User user = ServiceFactory.userService().getUser(username); 
    System.out.println(user.getPassword() + " " + user.getUsername()); 

    if(user != null){ 
     if(user.getUser_type() == 1){ 
      String cartId = ServiceFactory.customerService().getCartId(user.getUserId()); 
      Customer customer = (Customer) user; 
      customer.setCartId(cartId); 

      request.getSession().setAttribute("customer", customer); 
      response.sendRedirect("customer"); 
     }else{ 

     } 
    }else{ 
     userDoesNotExist = true; 

     request.setAttribute("userDoesNotExist", userDoesNotExist); 
     request.setAttribute("username", username); 
     RequestDispatcherManager.dispatch(this, "/login.jsp", request, response); 
    } 
} 

所以,回到我的问题,为什么我得到一个...

java.lang.ClassCastException: com.qbryx.domain.User cannot be cast to com.qbryx.domain.Customer 
com.qbryx.servlets.LoginServlet.doPost(LoginServlet.java:50) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

回答

1

这是正确的 - 它的客户谁扩展了用户,而不是周围的其他方式。将一个客户投射到用户总是可以的,但是将一个用户投射到客户将不会成功,除非该对象实际上是一个客户。

如果您将“扩展”从Java翻译成英语,您会得到每个客户都是用户,但不是evry用户是客户。

1

java.lang.ClassCastException:

铸造(向下转换和向上转型)时,会发生在不同的层次结构,会出现此例外。

在这里,您试图投的用户对象(父类)到客户对象(子类)

Customer customer = (Customer) user;// this is wrong since user is not a customer 

为了避免ClassCastException可以用户instanceof运营商检查

if(user instanceof Customer){ 
    customer = (Customer) user; 
} 
相关问题