Accueil > Forum > > > > un new sur un generique
un new sur un generique
jeudi 15 mai 2008 à 22:07:32 |
un new sur un generique

coucou747
|
Salut j'ai un generique : <E> et je veux faire une fabrique d'elements de E j'ai tente un new E(); j'ai tente : public E factory() throws java.lang.InstantiationException, java.lang.IllegalAccessException{ E ob=null; return (E) ob.getClass().newInstance(); } mais ca part en nullpointeurException En Cpp, j'aurais juste eu a faire un new E(); mais la, je bloque... Si quelqu'un a la solution :) Merci d'avance
|
|
vendredi 16 mai 2008 à 08:46:42 |
Re : un new sur un generique

indiana_jules
|
Salut ne faudrait-il pas plutot qu'en sortit de ta fonction, le type soit : <? extends E> De plus, tu fais un 'E ob = null', et tu appelles une fonction dessus !!! (D'où nullPointerException)
A mon avis, c'est plutôt: NomDeMaClasseGeneriqueQuiNeSoitPasUneInterface.getClass().newInstance();
Voili voilà
[#Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises] [#Je ne comprends pas tout, mais je parle de tout : c'est ce qui compte]
|
|
vendredi 16 mai 2008 à 09:42:36 |
Re : un new sur un generique

Twinuts
|
Réponse acceptée !
Salut, je sais pas trop si ça va correspondre à ce que tu veux mais voici une solution : (prise ICI) import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException;
publicfinalclass GenericInstantiator { public <T> T makeInstance(Class<T> c) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException { T instance = null; Class[] emptyParams = {}; Constructor<T> con = c.getDeclaredConstructor(emptyParams); con.setAccessible(true);
instance = con.newInstance(); return instance; } }
------------------------------------ "On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
OoWORAoO
|
|
vendredi 16 mai 2008 à 10:46:51 |
Re : un new sur un generique

coucou747
|
indiana_jules, cette solution appelle une methode oui, mais statique (enfin je crois, ou si elle ne l'est pas, elle n'utilise pas this...) bref, en Cpp et en delphi, ca aurait marche...
twinuts, je vais tester ca des que possible :)
pour le moment, je m'en suis sorti en passant une Class en parametre, c'est moche, mais ca fonctionne.
Bref, j'achete une barette de ram et je teste ca :)
|
|
vendredi 16 mai 2008 à 12:27:13 |
Re : un new sur un generique

AlexN
|
Salut,
Je ne vois pas de possibilité pour avoir une usine pour tous les objets possibles. Une usine est dédiée à la fabrication d'objets d'un certain type ou dérivant d'un certain type. Enfin je me trompe peux être.
Voici un exemple d'usine qui délègue la fabrication d'objet à la classe qui l'utilise (usine abstraite) :
/** * Usine abstraite pour objet issue d'une base de données * * @param <T> */ import java.sql.ResultSet; import java.sql.SQLException;
public abstract class Factory<T>{
/** * la création d'un objet à partir d'un ResultSet est délégué à la classe utilisatrice * Seule la classe utilisatrice sait comment fabriquer un objet à partir des champs du ResultSet * * @param resultSet * @return * @throws SQLException */ public abstract T create(ResultSet resultSet) throws SQLException; }
/** * Classe utilisatrice de l'usine Factory * */ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
public class MyObject{ private final Integer myInt; private final Integer myString; /** * La construction de l'objet a lieu au sein de la classe, * car elle seule sait comment fabriquer un objet à partir des champs du ResultSet * * @param resultSet * @throws SQLException */ private MyObject(final ResultSet resultSet) throws SQLException { this.myInt = resultSet.getInt("myInt"); this.myString = resultSet.getInt("myString"); } /** * L'usine à objet de la classe * Elle definit le create à partir du constructeur privé de la classe qui utilise le ResultSet * */ private static final Factory<MyObject> myObjectFactory = new Factory<MyObject>(){ @Override public MyObject create(ResultSet resultSet) throws SQLException{ return new MyObject(resultSet); } }; public String toString() { return "myInt = " + this.myInt + " myString = " + this.myString; } public static void main(final String[] args){ final int someId = 1; Connection connection = null; Statement statement = null; ResultSet resultSet = null; MyObject object = null; try{ connection=java.sql.DriverManager.getConnection("jdbc:mysql://hostname:port/database?user=myUser&password=myPassword"); statement = connection.createStatement(); resultSet = statement.executeQuery("SELECT myInt, myString FROM myTable where myId = " + someId); object = myObjectFactory.create(resultSet); } catch(final SQLException e){ e.printStackTrace(); } finally { if (resultSet != null) try{ resultSet.close(); if (statement != null) statement.close(); if (connection != null) connection.close(); } catch(final SQLException e){ e.printStackTrace(); } } if (object != null) System.out.println(object); } }
|
|
vendredi 16 mai 2008 à 12:48:06 |
Re : un new sur un generique

coucou747
|
quand tu dis : "Une usine est dédiée à la fabrication d'objets d'un certain type ou dérivant d'un certain type." bah dans mon cas, elle fait des <E>... En Cpp, ca passe sans probleme, mais les generiques en java ont pas mal de retard sur ceux du Cpp
|
|
vendredi 16 mai 2008 à 14:20:48 |
Re : un new sur un generique

AlexN
|
Ok c++ est plus ancien, mais son modèle objet est trop spaghetti (héritage multiple, pas de classe mère (Object)...). Le mécanisme des patrons de classe était certes joli, mais plus difficile à maintenir. Ok java est encore jeune (et encore ça se discute), mais il n'y a aucune raison pour qu'il existe de modèle absolu de fabrication des objets dont pas de raison qu'il existe un modèle absolu des usines à objet. Regarde aussi le modèle objet de javascript (héritage par prototype et non par classe => héritage dynamique). Mécanisme que ni c++ ni java ne sont capables de proposer (faire changer la hiérarchie de classe d'un objet en cours d'execution, c'est fort quand même !!). Certains parlent même de AOP (Aspect Oriented Programming), une extension de l'OOP. Le modèle objet n'est pas figé, les langages évolueront en fonction des nouvelles propositions. Java suit sa route...
Faire des <E> ou des <? extends E> au sens large est plutôt utopique. Ton programme devrait prendre en compte la totalité des cas de E et pour faire simple il y en a une ... infinité...
|
|
vendredi 16 mai 2008 à 14:30:02 |
Re : un new sur un generique

AlexN
|
La solution de Twinuts part du principe que tout les objets ont un constructeur sans arguments. Qui a décrété que toutes les classes avait forcément ce type de constructeur.
|
|
vendredi 16 mai 2008 à 17:57:46 |
Re : un new sur un generique

coucou747
|
Réponse acceptée !
twinuts, j'avais pas vu ce matin : tu passes : Class<T> c
en parametre c'est justement ce que je voulais eviter, daedric m'avait bien aide a trouver cette solution, mais elle ne me plaisait pas trop (parce-que ca fait une redondence, on met T deux fois quand on appelle la classe... bref) public class JsonCollection<E extends JsonAble>{ ... Class classe; ... public E factory() throws java.lang.InstantiationException, java.lang.IllegalAccessException{ return (E)classe.newInstance(); } public JsonCollection(... Class c) throws ...{ .... classe = c; ... } }pour l'appel, ca donne un truc genre : JsonCollection<Etudiant> ets=new JsonCollection<Etudiant>(...Etudiant.class);et tu vois, j'utilise deux fois Etudiant (en plus du type)
|
|
vendredi 16 mai 2008 à 19:38:58 |
Re : un new sur un generique
|
Cette discussion est classée dans : java, lang, tente, ob, generique
Répondre à ce message
Sujets en rapport avec ce message
chargement applet netscape [ par kramp ]
lorsque je lance l'applet que j'ai créé avec appletviewer, il n'y a pa de probleme, il fonctionne correctement.Si je veux ouvrir ma page dans netscape
java.lang.NullPointerException [ par Zad2002 ]
je voudrais savoir a quoi correspond la fonction java.Lang.NullpointerException car en lancer mon application avec un fichier source pour lire des cod
5min à vivre et on veut faire du java. SVP [ par Milie ]
Bonjour à tous!!On a un problême pour charger une DLL. On a cette erreur:java.lang.ExceptionInInitializerError: java.security.AccessControlException:
REPONSE POUR DUSS (porbleme JDBC ACCESS [ par PhilippeA ]
Plug-in Java(TM): Version 1.4.1_02Utilisation de la version JRE 1.4.1_02 Java HotSpot(TM) Client VMRépertoire d'accueil de l'utilisateur = C:\WINNT\Pr
erreur incompréhensible [ par EvilGost ]
Mon probleme est le suivant:J'ai un CD avec des exemples de prog en Java. Le problème, dans la plupart des cas, c'est que j'obtiens une erreur dès qu'
probleme de java.lang.OutOfMemoryError [ par gaga38 ]
salut à tous,je fais une interface internet explorer pour une interrogation de base de données, donc j'utilise un JSP pour l'interface et une servlet
Génération d'un fichier PDF en Java [ par syl2 ]
Bonjour,je tente depuis quelques jours de générer un fichier pdf à partir d'une Appli Java. Pour le moment, je tente simplement de faire un fichier vi
java.lang.NullPointerException [ par eklektik ]
en compilant un programme java j'ai ca comme erreur et je sais pas a quoi ca correspond :java.lang.NullPointerException at java.util.Hashtable.put(Has
probleme de compilation [ par pmedina ]
Bonjour tout le monde.J'ai souvent un probleme quand je cherche à compiler ,j'ai le message suivant: C:\JavaWork>javac SimpleFrame.javaException in th
Can't convert float to java.lang.Float [ par jmg02001 ]
bonjour, sauriez vous pourquoi ce code me donne cette erreur et comment faire String[] coordonnee = request.getParameter("xy").split(",");java.lang.Fl
Livres en rapport
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|