Hacer un CAST dinámico

f_browny
19 de Mayo del 2004
Necesito hacer un cast sobre un objeto y transformarlo a un tipo, determinado por el valor de una variable. Pero cuando hago el cast me da un error, me dice que no es un tipo. Mi código:

nuevoTipo = //leo el tipo de un fichero
c = Class.forName(nClase);
cons = c.getConstructors();
//HASTA AQUI TODO VA BIEN
//AHORA NECESITO HACER UN CAST DINÁMICO, DEBE PODERSE ELEGIR LA CLASE DE OBJETO QUE ES.
obj = ( nuevoTipo ) cons[0].newInstance(aux);
//ME DA UN ERROR PORQUE DICE QUE nuevoTipo NO ES UN TIPO DEFINIDO. YO QUIERO QUE COJA EL VALOR DE LA VARIABLE, QUE SI ES UN TIPO. PERO NO LO HACE.


ALGUIEN PODRÍA SALVARME LA VIDA. GRACIAS ;-)

Lucas
19 de Mayo del 2004
Prueba a utilizar interfaces que implementen todos los tipos de objetos que puedes recibir o herencia de una clase padre.
Si no, si quieres hacer un casting a un tipo concreto, tienes que tener en el codigo definida una variable con ese tipo, por lo que tienes que tener tantas vairables como tipos puedas definir, por lo que tendras que hacer un if ( instanceof ) de todas formas

Heihachi
19 de Mayo del 2004
nuevoTipo se conoce en tiempo de ejecución y para hacer el cast supongo que el compilador debería saber a que hacer el cast, dudo que puedas hacerlo así.

¿obj es de tipo Object? Porque si es así el cast no hace nada, al final tendrás una referencia a un object igualemente

Si tienes un número reducido de tipos posibles puedes hacer el cast por casos:
Object o=cons[0].newInstance(aux);
if (o intanceof Tipo1.class){
var1=(tipo1)o;
}else if (o instanceof Tipo2.class){
var2=...
}

Si son tipos diferentes con métodos comunes que son los que quieres operar que todas las clases implementes una interface con estos métodos y haces el cast a esa interface

Y si no te creo que sólo queda pelearse con las clases del package java.lang.reflect.*

Saludos!

friendly
19 de Mayo del 2004
Gracias por contestar,

Lo cierto es que no tengo un numero limitado y acotado de tipos, por eso no puedo hacerlo por la promera forma.

obj es de un tipo definido por mi del que heredan todas las demas clases. Pero no tengo tanta suerte de que todas las clases tengan los mismos metodos. Algunos si, pero otros no. Por lo que tampoco me vale esta segunda opcion.

Miraré a ver el java.leng.reflect.*