Hola a todos , tengo una duda en relacion a un codigo que estoy leyendo, no comprendo bien como funciona la instanciacion en este codigo, por favor si alguien me pueda explicar se lo agradaceria mucho
este codigo no comprendo la linea: cvsubmenu=(MenuSubBeanData)vectorSubMenu.get(n);
public Vector obtieneSubMenu (String menuElegido , String submenuElegido,
ServletContext sc, HttpServletRequest request, HttpServletResponse response) throws Exception{
String menu="";
Vector vectorSubMenu=(Vector)request.getAttribute("submenu");
Vector vectorSubMenuMostrar=new Vector();
int n=0;
try { while (n < vectorSubMenu.size()) {
MenuSubBeanData cvsubmenu = new MenuSubBeanData();
cvsubmenu=(MenuSubBeanData)vectorSubMenu.get(n);
//accion=cvsubmenu.getAccion();
menu=cvsubmenu.getMenu();
if (menu.trim().equals(menuElegido))
{
if (cvsubmenu.getSubmenu().trim().equals(submenuElegido)){
cvsubmenu.setSubmenuelegido("current");
}
vectorSubMenuMostrar.add(cvsubmenu);
}
n++;
}
} catch (Exception exc) {
con.rollback();
throw exc;
}
return vectorSubMenuMostrar;
}
cvsubmenu=(MenuSubBeanData)vectorSubMenu.get(n);
Estas en presencia de un casting explicito (Narrowing Casting)
https://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#get(int) (https://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#get(int))
vectorSubMenu.get(n)
Si usas un IDE y borras justo (MenuSubBeanData) tu ide por medio de Reflection en tiempo de ejecución Runtime debería de quejarse porque el método .get() obtiene el index donde a la vez tiene un Objeto pero no sabe que tipo de objeto en especifico debe asignar,entonces al programador le toca dicha tarea aunque ya los IDE actuales por Reflection lo solucionan
En este caso el Object obtenido de que tipo será ? MenuSubBeanData
Pero como ?
Vector vectorSubMenu = (Vector) request.getAttribute("submenu");
Esta linea seguramente crea el Vector de ese tipo con el metodo getAttribute("submenu")
Recordando que java es fuertemente tipado
Otra manera de saber mas a fondo y con precisión es hacer debugging colando un breakPoint por ejemplo en
Vector vectorSubMenu = (Vector) request.getAttribute("submenu");
cvsubmenu = (MenuSubBeanData) vectorSubMenu.get(n);
Hola rub'n, gracias por tu respuesta y explicacion, pero sigo con dudas, entiendo que:
request.getAttribute("submenu");
devuelve string, pueden ser varios string que son casteados al mismo tipo del objeto 'vectorSubMenu' que es un Vector, es decir, se obtiene un vector con la coleccion de strings, ¿correcto?
La linea: cvsubmenu = (MenuSubBeanData) vectorSubMenu.get(n);
entiendo castea un string(un elemento del vector) al tipo 'MenuSubBeanData' pero que obtengo en 'cvsubmenu'?; MenuSubBeanData es una clase que tiene propiedades, getters y setters y demas metodos, que debo interpretar de esa linea mas alla de las correspondencias entre tipos de objetos y sus declaraciones.
Digamos que la Clase MenuSubBeanData se defina asi:
public class MenuSubBeanData{
private String menu="";
private String submenu="";
private String descripcion="";
public String getMenu() {
return menu;
}
public void setMenu(String menu) {
this.menu = menu;
}
public String getSubmenu() {
return submenu;
}
public void setSubmenu(String submenu) {
this.submenu = submenu;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
}