Création d’une instance générique de type en Java

J’ai la classe Java suivante

public class MyClass  implements RowMapper 

J’implémente la méthode suivante:

 @Override public T mapRow(ResultSet rs, int arg1) throws SQLException { 

Comment créer une instance de type ‘T’ sur cette classe?

J’ai essayé de définir la classe de type T et d’utiliser “myInstance.newInstance ()” mais je n’ai pas pu le définir. L’envoi de la classe en tant que paramètre de la méthode et l’utilisation de la méthode “newInstance ()” fonctionnent, mais je veux pouvoir le faire sans avoir à le passer en tant que paramètre. Merci!

Les génériques Java sont implémentés par effacement, ce qui signifie qu’il n’y aura pas d’information de type de paramètre à l’exécution. Vous ne saurez pas la classe T au moment de l’exécution (il n’y a pas de classe T.). Vous devez donc passer l’object Class tant que paramètre de méthode afin de faire ce que vous voulez.

Vous perdez toutes les informations sur le type lorsque vous passez un object dans une classe / fonction générique.

La seule façon de faire cela est de passer l’object Class au constructeur \ fonction:

 static class Gen { private Class mClass; public Gen(Class cls){ mClass = cls; } public T get(){ try{ return mClass.newInstance(); }catch(Exception e){ e.printStackTrace(); return null; } } } static class A{ public Ssortingng name = "A!"; } public static void main(Ssortingng[] args) { Gen g = new Gen(A.class); A a = g.get(); System.out.println(a.name); } 

Malheureusement, à cause de la suppression du texte, vous ne pouvez pas faire ce que vous voulez.

Vous devrez indiquer explicitement à votre classe le type à instancier, en lui indiquant la Class ou, peut-être plus élégamment, en lui atsortingbuant une fabrique pour créer des instances.

Il est possible d’extraire la classe à laquelle T était lié dans une sous-classe particulière, bien que ce ne soit pas très facile:

http://www.artima.com/weblogs/viewpostP.jsp?thread=208860

J’ai une version légèrement meilleure du code dans ce post ici:

http://github.com/ISA-tools/jUtils/blob/master/src/main/java/ac/ebi/utils/reflection/ReflectionUtils.java

http://github.com/ISA-tools/jUtils/blob/master/src/test/java/uk/ac/ebi/utils/reflection/ReflectionUtilsTest.java

Cette approche n’est pas très rapide non plus, donc si les performances sont une préoccupation, une alternative plus brutale pourrait consister à passer T et une instance de la classe également là où vous en avez besoin.

Bien sûr, après avoir eu un tel cours, vous devez utiliser la reflection pour l’instancier.