Foros del Web » Programación para mayores de 30 ;) » Java »

Averiguar de que tipo de dato es un Object

Estas en el tema de Averiguar de que tipo de dato es un Object en el foro de Java en Foros del Web. Hola amigos, queria hacerles una consulta ya q estoy necesitando hacer una cosa y no consigo q funcione. A ver mi problema es el siguiente, ...
  #1 (permalink)  
Antiguo 22/05/2008, 04:05
 
Fecha de Ingreso: diciembre-2004
Mensajes: 51
Antigüedad: 19 años, 11 meses
Puntos: 0
Averiguar de que tipo de dato es un Object

Hola amigos, queria hacerles una consulta ya q estoy necesitando hacer una cosa y no consigo q funcione. A ver mi problema es el siguiente, yo tnego un ArrayList al q pueden entrar distintos tipos de datos, segun hagamos una cosa o otra, la idea es poder recorrer el ArrayList con un iterator, pero claro el unico casting q puedo hacerle es a Object, por q a priori no se de q tipo de datos puede estar relleno el arrayList, mi intencion es poder crear un objeto del tipo de datos q hay en el ArrayList, os dejo un pequeño ejemplo.

ArrayList lista = new ArrayList();

// Se insertan los datos q sean del tipo q sea.

Iterate it = lista.iterate();
while (it.hasNext()){
Object o = it.next();
//Hacer casting del objeto o al tipo de dato q sea realmente.
}

Bueno se q con la api reflection, puedo obtener a q clase pertenece, pero lo q no se es como puedo crear un objeto de ese tipo a partir de ahi.

Si alguien sabe como puedo hacerlo le estaria muy agradecido.

Muchas gracias por todo.
Un saludo.
  #2 (permalink)  
Antiguo 22/05/2008, 06:49
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 10 meses
Puntos: 6
Respuesta: Averiguar de que tipo de dato es un Object

Hola mira para saber de que tipo es el objeto lo deberias castear por en nombre para obtener el mismo lo haces asi o.getClass().getSimpleName() esto te devuelve el nombre, ahora me parece que lo que estas haciendo tu es meter papas, boniatos y zanahoras dentro de una misma bolas jejeje creo que tendira que encontrar la manera de no mezclar todo en un mismo array desde el punto de vista de la POO no es muy trivial que digamos, podrias poner un array para cada tipo de objeto que tubieses
saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #3 (permalink)  
Antiguo 22/05/2008, 13:26
 
Fecha de Ingreso: diciembre-2004
Mensajes: 51
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Averiguar de que tipo de dato es un Object

Jejeje bueno la intencion de hacer esto no es meter distintos tipos de objetos en el mismo array mezclando distintos tipos de datos, la intentacion es q la misma clase sirva apra tratar varios problemas. Por cierto no he sido capaz de hacerlo como me has dicho si no te importa a ver si puedes poner un ejemplito.

Muchas gracias
Un saludo
  #4 (permalink)  
Antiguo 22/05/2008, 14:11
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Averiguar de que tipo de dato es un Object

Averiguar el tipo de la clase en tiempo de ejecucion no te servira de mucho si no es con mucho trabajo y usando reflection, ya que como dice djagu es mejor no mezclar unas cosas con otras.

Quiza si nos explicas la idea general un poco mas en detalle, podamos ayudarte a encontrar una solucion mejor. Si todos los objetos que vas a poder meter en el Array tienen unas caractersticas comunes, por ejemplo, lo suyo seria usar una interfaz que declare esas cosas comunes y asi podras manipular cualquier tipo de objeto que implemente la interfaz.

Si todas las clases que vas a meter son distintas y no tienen nada en comun... entonces no tiene mucho sentido lo de hacer un metodo para tratarlas todas, a no ser que las trates como meros Object.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 22/05/2008, 14:21
 
Fecha de Ingreso: diciembre-2004
Mensajes: 51
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Averiguar de que tipo de dato es un Object

Realmente se q lo que intento no es un buen metodo, se q apenas me servira pero mas q nada es q vi interesante el intentar de crear un objeto de esa manera, por el simple hecho de saber si se puede hacer, la idea de lo q estoy haciedno, pues es simplemente una aplicacion web donde se muestran unos listados, estos listados pueden ser de distintos tipos de datos, y ahora como ampliacion a esta aplicacion pues necesito una clase comun q trate los distintos tipos de datos de los q se componen estas listas.

Muchas gracias
un saludo
  #6 (permalink)  
Antiguo 22/05/2008, 18:17
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 10 meses
Puntos: 6
Respuesta: Averiguar de que tipo de dato es un Object

creo que no entiendo mucho, pero porq no tener dos objetos uno q es el que tiene los datos y un objeto que sea tipo de objeto que posea los otros datos y cada objeto tenga un tipo ahora lo explico mejor

Objeto x - atributos(valorString, valorInteger, TipoObjeto z)

TipoObjeto z - atributos(nombre, descripcion)

despues tienes un arraylist de Objetos x y ahi puedes saber el tipo que es y de ahi manejar una lista para cada tipo de objetos o la misma cargandola con un tipo de objeto seleccionado previamente pasado por parametros
saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #7 (permalink)  
Antiguo 23/05/2008, 03:17
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Averiguar de que tipo de dato es un Object

Si realmente no es un buen metodo y apenas te va a servir apenas, jejeje, mucha curiosidad has de tener .

La cuestion es que si no puedes al menos saber algo a priori de las clases que vas a tratar, entonces no puedes compilar tu programa para que haga uso de esas caracteristicas y entonces lo unico que puedes hacer es tratarlos como Object o usar Reflection para intentar averiguar cosas sobre ellos y decidir en tiempo de ejecucion lo que hacer con ellos.

Si tienes un numero limitado de clases y solo tienes que mostrar el valor de alguna forma, siempre puedes usar el operador "instance of" of el metodo "isInstance" de Class para distinguir unos de otros.

if(object instance of java.lang.String)
{
String s = (String) object;
//hacer algo con el String
}
else if(object instance of java.util.Date)
{
Date d = (Date) object;
//hacer algo con el Date
}

...

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #8 (permalink)  
Antiguo 23/05/2008, 04:18
Avatar de Llave  
Fecha de Ingreso: abril-2005
Ubicación: Galicia
Mensajes: 52
Antigüedad: 19 años, 7 meses
Puntos: 1
Respuesta: Averiguar de que tipo de dato es un Object

Solo añado como corolario a lo que te han respondido los demás, que tratar de leer una lista mediante Cast, es lento y caro de procesador. Si la lista es suficientemente grande, y el número de clases que contiene es bastante diversa... le pueden dar las uvas al sistema para mostrarte la lista por pantalla.

Mejor que sigas los consejos que te dan aquí y plantees la solución de otra forma.
Si lo que quieres es investigar... adelante :)
  #9 (permalink)  
Antiguo 23/05/2008, 04:20
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Averiguar de que tipo de dato es un Object

Como ya te han dicho, para que sea de alguna utilidad, tienes que saber algo de los objetos.

Lo que se me ocurre es, visto que lo que quieres es hacer eso de los listados, que una forma de hacerlo es usar un interfaz común para todos los objetos que pueden salir en un listado. Esto si los quieres tratar a todos igual, claro.

Me explico un poco. Imagina que en tu ArrayList puede haber Perros, Gatos y Ardillas. Y quieres hacer una clase que pueda pintar cualquiera de esos animales en forma de listado. Una forma de hacerlo es lo que preguntabas: Que sea la clase PintadorDeListas la que investigue qué clase es y la pinte.

Pero otra forma de hacerlo es poner alguna restricción sobre las clases que pueden pintarse: hacer que todas implementen el interfaz Pintable (por llamarlo de alguna forma).

Haces un interface Pintable que defina algunos métodos que necesita el PintadorDeListas. Para no complicarlo mucho lo haré sencillo: Podría ser algo como getPropiedades() y getValores(). Luego haces que todas las clases que vayan a poder ser pintadas tengan que implementar Pintable y por tanto den esos 2 métodos.

PintadorDeListas no necesitaría saber qué objeto Perro, Gato o Ardilla es. Sólo que es Pintable:

Código:
Pintable bisho = (Pintable) it.next();
Y ahora podrías llamar a bisho.getPropiedades() y bisho.getValores().


Esto lo he contado muy simplificado, claro. Puedes mejorarlo mucho.
  #10 (permalink)  
Antiguo 23/05/2008, 08:13
 
Fecha de Ingreso: diciembre-2004
Mensajes: 51
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Averiguar de que tipo de dato es un Object

jejeje me ha gustado el ejemplo del bisho jejeje bueno como ya os dije mas que nada era por curiosidad por q se me habia planteado el problema y pense q deberia de haber alguna forma de conseguir crear un objeto del tipo del q es en tiempo de ejecucion, ya q mediante reflection podemos saber, el tipo de dato q es, sus metodos y atributos, ya de todas formas lo he solucionado de otra, forma, al final acabe haciendolo con instanceof por q lo q no me lo plantee asi desde un principio es por q esos tipos de datos en cualquier momento pueden ampliarse y tendriamos q modificar esta clase de nuevo, la solucion de la interface la veo bien, pero conllevaria modificar bastante codigo en bastantes sitios.

En fin muchas gracias a todos.
Un saludo.

PD: Si a alguno se os ocurre como hacer un objeto como digo decirme q ya me he quedado con la intriga, quitando q no sea correcto, pero me gustaria saber si se puede hacer jeje.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:10.