Ce que tu as écrit n'a aucun sens, génériques en Java sont destinés à ajouter la fonctionnalité de polymorphisme paramétrique aux objets.
Qu'est-ce que cela signifie ? Ça veut dire que tu veux garder un peu variables de type de vos classes indécises, pour pouvoir utiliser vos classes avec de nombreux types différents.
Mais votre variable de type T
est un attribut qui est résolu au moment de l'exécution, le compilateur Java compilera votre classe en prouvant la sécurité de type sans essayer de savoir quel type d'objet est T
il est donc impossible qu'il vous laisse utiliser une variable de type dans une méthode statique. Le type est associé à une instance d'exécution de l'objet tandis que le type est associé à une instance d'exécution de l'objet. public void static main(..)
est associé à la définition de la classe et à cette portée T
ne veut rien dire.
Si vous voulez utiliser un variable de type à l'intérieur d'une méthode statique, vous devez déclarer la méthode comme générique (ceci parce que, comme expliqué variables de type d'une classe modèle sont liées à son instance d'exécution ), pas la classe :
class SandBox
{
public static <T> void myMethod()
{
T foobar;
}
}
cela fonctionne, mais bien sûr pas avec main
puisqu'il n'y a aucun moyen de l'appeler de manière générique.
EDITAR : Le problème est qu'à cause de effacement de type une seule classe générique est compilée et transmise à la JVM. Le vérificateur de type vérifie simplement si le code est sûr, puis, comme il l'a prouvé, chaque type de information générique est rejetée.
Pour instancier T
vous devez connaître le type de T
mais il peut s'agir de plusieurs types en même temps. Une solution qui ne nécessite qu'un minimum de réflexion consiste donc à utiliser Class<T>
pour instancier de nouveaux objets :
public class SandBox<T>
{
Class<T> reference;
SandBox(Class<T> classRef)
{
reference = classRef;
}
public T getNewInstance()
{
try
{
return reference.newInstance();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
public static void main(String[] args)
{
SandBox<String> t = new SandBox<String>(String.class);
System.out.println(t.getNewInstance().getClass().getName());
}
}
Bien sûr, cela implique que le type que vous voulez instancier :
- n'est pas un type primitif
- il a un constructeur par défaut
Pour utiliser d'autres types de constructeurs, vous devez approfondir la réflexion.
0 votes
Comment faites-vous pour savoir ce qu'est le "T" ? Quelle partie du programme vous "dit" quel T utiliser ?
1 votes
Je vous suggère également la FAQ sur les produits génériques : angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html