Java, casting dinámico

cabron

Hola

Necesito hacer un casting a un objeto, pero hasta que el programa está en ejecución, no se a que clase hay que hacer el casting... algo parecido a esto:

void casting(String tipoClase, Object objeto)
{

((tipoClase)objeto).metodoDeLaClase();
}

Ya sé que en este ejemplo no sé ve claro los motivos por los que tengo que hacerlo, pero bueno, me hace falta.

He buscado por ahí, y he visto que existe un método Class.cast() , pero en la versión de Java que uso no está disponible, y no hay posibilidad de actualizar el entorno, ¿alguien tiene alguna idea?.

Gracias.

Edit:

Bueno acabo de tener una iluminación en el último momento y he encontrado un diseño alternativo que me he evita tener que hacer esto, pero ya por curiosidad si alguien lo sabe, tamibién me gustaría saberlo.

Mendasp

Supongo que podrías usar getClass() para ver de que clase es el objeto.

Tambien puedes usar instanceof si quieres comprobar si A (objeto) es una subclase de B, para hacer el cast.

if (objetoA instanceof ClaseB)

B

La solucion cutre que se utiliza para eventos.

Si sabes que van a ser X clases seguro.

Lo coges como Object --> getClass --> if clase X --> casting --> tratar a tu objeto.

Lo sabras xD, pillas un evento de una ventana y quieres saber si ha sido un boton, una box....

Ahora bien, si pueden ser mil clases distintas... tiene que ser con el Class.cast, pero de todas maneras, si quieres hacer cosas distintas dependiendo de la clase que sea, no queda mas narices que hacer la cutre.

Incluso puedes pasar de hacer casting con la primera solucion dependiendo para que lo quieras.

kas

Existe programacion generica en Java?

Puedes definir una interfaz o clase base apra esos objeto con metodos virtuale CastTo y CastFrom?

Khanser

Puedes usar genericidad metodica, genericidad de clase, o "instanceof"

te recomiendo:

void tipoClase casting(String tipoClase, tipoClase objeto)

{

#

objeto.metodoDeLaClase();

}

y ese metodo te sirve para esa clase, si quieres usar otra clase ->

void tipoClase2 casting(String tipoClase, tipoClase2 objeto)

{

#

objeto.metodoDeLaClase();

}

aqui usamos sobrecarga de metodos, si todas las clases que vayas a usar con este metodo, heredan de una misma clase, puedes usar herencia de tipos:

tipoClasePadre <-- de la que heredan todas

void (tipoGenerico extends TipoClasePadre)casting(String tipoClase, tipoGenerico objeto)

{

#

objeto.metodoDeLaClase();

}

Este metodo solo te funcionará para las clases que hereden de TipoClasePadre (por lo que el metodoDeLaClase() ya lo tendran implementado las clases que heredan ya sea por refinamiento, sustitucion, o tambien puede ser que ese metodo no haga una mierda xD)

tambien puedes usar el instanceof:

void casting(String tipoClase, Object objeto)

{

if (objeto instanceof (tipoClase))

((tipoClase)objeto).metodoDeLaClase();

}

Espero haberte ayudado ;)

PD: Todo lo que te he explicado solo funciona a partir del jdk 1.5 o superior

Gnos1s

La idea es como dice #5.

Con la primera opción usas la ligadura dinámica para que coja el método sobrecargado oportuno, pero por cada tipo necesitas repetir código y es un follón.

Con la tercera forma, necesitas un if que compare cada clase, y como metas alguna nueva, a cambiar en todos los sitios las comprobaciones de los getClass.

De la segunda forma, puedes tirar de herencia para que haga lo que quieres. Quizás puedas resolverlo tirando de herencia de Object (que ya lo hacen todos, vamos).

Esta última forma es la he usado yo para unas prácticas recientes para hacer una copia profunda de unos objetos, aunque indicaba directamente la clase del objeto. De esta clase heredaba otra, así que heredaba la copia profunda directamente.

Por eso me refiero, que si la clase padre es Object, se debería poder hacer un casting de tipo Object, y puesto que todas las clases heredan de Object, el método se la tragaría bien (espero no estar confundido).

Échale un vistazo al msj privado que te he mandado.

cabron

Grracias por las respuestas, pero como dije en el primer post, trabajo con una versión antigua de java y no tengo posibilidad de actualizar el entorno.

Además trabajo con clases ya diseñadas que no puedo modificar, por eso dije que aunque en el ejemplo no se veía claro, tengo motivos para necesitar un casting a una clase desconocida, no me vale ni la programación genérica ni el polimorfismo.

Lo de utilizar:


String tipoClase = objeto.getClass.getName();

if (tipoClase.equals("UnTipo )
{
    ((UnTipo)objeto).hacerAlgo();

}
else if(tipoClase.equals("OtroTipo"):
{

   ((OtroTipo).hacerAlgo();
}


también se me había ocurrido, pero no quería recurrir a eso, ya que es muy poco flexible, tengo que ir poniendo todos los posibles tipos, y si cambian tengo que modificar la lista, por eso buscaba algo tipo Class.cast() que funcionase en versiones antiguas ya que no lo tengo disponible, pero parece ser la única manera que tendría de hacerlo es comprobando cual es el tipo de la clase, comparandolo con una lista fija de clases.

sh0ty

No me hagas mucho caso pero creo que por lo menos en C habia una funcion llamada o parecida a 'incode' que si no recuerdo mal servia para añadir codigo al codigo, o algo asi...

Gnos1s

Pues nada, a la vieja usanza...

Miminh0

pero porke no kreas una interfaz komo bien te han dicho ke sea implementada por todos tus tipos de clases y haces el cast al tipo de la interfaz ?

cabron

#10:

Sacado de mi post nº #7:

"Además trabajo con clases ya diseñadas que no puedo modificar,"

Miminh0

#11 sorry, solo lei hasta ke ponia ke no podias aktualizar tu entorno.

al final por kual de las opciones te has dekantado ?

cabron

Decantarme lo que se dice decantarme... pues digamos que solo me queda una opción disponible (la que sale con código en el post #7), así que no había mucho entre lo que decidir

Fr4nk0

cabron, en la version de java que usas, ¿puedes usar la API reflexion? porque entre otras cosas, te permite crear instancias de clases, que se van añadiendo a tu programa en tiempo de ejecución, y creo que sabiendo eso, puedes ya hacer castings, usando el getclass. Pero vamos, nose si en la version de java que usas, esta disponible. Pero si eso miralo y ya me cuentas lo que sea :) Hasta luego.

Edit: Bueno, si creas una instancia de la clase nueva ( q con eso se crea desde un string) puedes obtener los metodos y todo, o usarlos. Pero bueno no se si esto que te cuento es lo q necesitas. Ya me contaras.

Usuarios habituales

  • Fr4nk0
  • cabron
  • Miminh0
  • Gnos1s
  • sh0ty
  • Khanser
  • kas