Ouais je sais. Titre long de la question ... J'ai donc le nom de classe dans la chaîne. Je crée dynamiquement un objet de cette classe de cette manière:
String className = "com.package.MyClass";
Class c = Class.forName(className);
Object obj = c.newInstance();
Comment puis-je convertir dynamiquement cet objet obj en MyClass? Je ne peux pas écrire de cette façon:
MyClass mobj = (MyClass)obj;
... car className peut être différent.
vous ne le faites pas, déclarez une interface qui déclare les méthodes que vous souhaitez appeler:
public interface MyInterface
{
void doStuff();
}
public class MyClass implements MyInterface
{
public void doStuff()
{
System.Console.Writeln("done!");
}
}
alors vous utilisez
MyInterface mobj = (myInterface)obj;
mobj.doStuff();
Si MyClass
n'est pas sous votre contrôle, vous ne pouvez pas lui faire implémenter une interface, et l'autre option est de s'appuyer sur la réflexion ( voir ce tutoriel ).
Je pense que c'est assez simple avec réflexion
MyClass mobj = MyClass.class.cast(obj);
et si le nom de classe est différent
Object newObj = Class.forName(classname).cast(obj);
Vous n'avez pas besoin de convertir l'objet en objet MyClass car il l'est déjà. Ce que vous voulez vraiment faire, c'est le transtyper, mais comme le nom de la classe n'est pas connu au moment de la compilation, vous ne pouvez pas le faire, car vous ne pouvez pas déclarer une variable de cette classe. Je suppose que vous voulez/avez besoin de quelque chose comme "typage du canard", c'est-à-dire que vous ne connaissez pas le nom de la classe mais que vous connaissez le nom de la méthode au moment de la compilation. Les interfaces, comme proposé par Gregory, sont votre meilleur pari pour le faire.
@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
return (T) obj;
}
Si vous ne saviez pas que mojb
est de type MyClass
, comment pouvez-vous créer cette variable?
Si MyClass est un type d'interface ou un super type, il n'est pas nécessaire de faire un cast.