Change le
BaseObject[] objects = (BaseObject[])subset.toArray(new
BaseObject[0]);
par
BaseObject[] result = (BaseObject
[])java.lang.reflect.Array.newInstance( Class.forName(className), 0);
- Il serait utilise de cache le Class que tu fabriques avec la String ! Ne
pas faire plusieur fois le Class.forName(className) c'est tres couteux!
Dominique
|---------+---------------------------->
| | Aurelien Mazurie |
| | <aurelien.mazurie|
| | @free.fr> |
| | |
| | 10/01/2003 13:44 |
| | Please respond to|
| | java |
| | |
|---------+---------------------------->
>-------------------------------------------------------------------------------------------------------------------------------|
|
|
| To: [EMAIL PROTECTED]
|
| cc: (bcc: Dominique Gallot/BRU/MASTERCARD)
|
| Subject: Typecasting et tableaux
|
>-------------------------------------------------------------------------------------------------------------------------------|
Bonjour � tous,
J'ai toujours eu des probl�mes avec la gestion des types dans
les
tableaux en Java, mais l� je suis compl�tement bloqu�. Voil� ce que
j'essaye d'obtenir: j'ai un objet qui peut contenir plusieurs autres
objets de types variables, mais descendant tous d'une m�me classe
(BaseObject). Ce que je veux faire, c'est r�cup�rer par exemple au sein
de cette liste tous les objets d'une classe voulue (BaseObject ou
descendant). Voil� ce que j'ai:
------------------------------------------------------------------------
------------
ArrayList _list << liste h�t�rog�ne contenant
mes objets
public BaseObject[] getObjects (String className)
{
Iterator i = _list.iterator();
ArrayList subset = new ArrayList();
try
{
while (i.hasNext())
{
Object obj = i.next();
if (Class.forName(className).isInstance(obj))
{
subset.add((BaseObject)obj);
}
}
}
catch (java.lang.ClassNotFoundException e)
{
return new BaseObject[0];
}
BaseObject[] objects = (BaseObject[])subset.toArray(new
BaseObject[0]);
Arrays.sort(objects, new ObjectComparator());
return objects;
}
------------------------------------------------------------------------
------------
Sachant que l'argument className correspond au nom de la classe (du
"type") de l'objet que je veux extraire de la liste. Par exemple,
"core.object.BaseObject" ou "core.object.data.DataObject", avec
DataObject un descendant de BaseObject.
Cette m�thode fonctionne: c'est � dire que j'arrive bien � r�cup�rer
les objets du type que je souhaite (je le vois dans une console Jython,
o� tous les objets du tableau BaseObject[] renvoy� sont bien du type
voulu). L� o� ca coince, c'est lorsque je veux faire un typecasting du
tableau BaseObject[] qui m'est renvoy�.
Par exemple, si j'ai s�lectionn� tous les objets de type DataObject, il
me para�ssait normal de faire:
DataObject[] dataObjects =
(DataObject[])objectList.getObjects("core.object.data.DataObject");
A priori en effet, le tableau BaseObject[] ne contient QUE des objets
descendants de BaseObject, plus pr�cis�ment des DataObject. Et bien
s�r, ca ne marche pas... Lors de la compilation, pas de probl�me, mais
� l'ex�cution, j'ai un:
Exception occurred during event dispatching:
java.lang.ClassCastException: [Lcore.object.BaseObject;
Arrg... Ais-je loup� quelque chose ?
Aur�lien Mazurie