224 votes

Méthode statique dans une classe générique?

En Java, j'aimerais avoir quelque chose comme:

class Clazz<T> {
  static void doIt(T object) {
    // shake that booty
  }
}

Mais je reçois

Ne peut pas faire une référence statique pour les non-statique de type T

Je ne comprends pas les génériques delà les utilisations de base et ne peut donc pas faire beaucoup de sens. Cela n'aide pas que je n'ai pas pu trouver beaucoup d'infos sur internet sur le sujet.

Quelqu'un pourrait-il préciser si une telle utilisation est possible, de la même manière? Aussi, pourquoi mon original tentative infructueuse?

315voto

newacct Points 42530

Vous ne pouvez pas utiliser une classe de paramètres de type générique dans les méthodes statiques ou des champs statiques. La classe du type de paramètres sont uniquement dans la portée par exemple les méthodes et les champs d'instance. Pour les champs statiques et méthodes statiques, ils sont partagés entre toutes les instances de la classe, même en cas de différents types de paramètres, il est évident qu'ils ne peuvent pas compter sur un paramètre de type.

Il ne semble pas que votre problème devrait exiger l'utilisation de la classe du paramètre de type. Si vous décrivez ce que vous essayez de ne plus en détail, nous pouvons peut-être vous aider à trouver une meilleure façon de le faire.

160voto

Jason S Points 58434

Java ne sais pas ce que T est jusqu'à ce que vous instanciez un type.

Peut-être que vous pouvez exécuter des méthodes statiques en appelant Clazz.doit(quelque chose) mais il semble que vous ne pouvez pas.

L'autre façon de gérer les choses est de mettre le type de paramètre dans la méthode elle-même:

static <U> void doIt(U object)

qui n'a pas le droit de restriction sur U, mais c'est mieux que rien....

56voto

Chris Points 141

J'ai rencontré ce même problème. J'ai trouvé ma réponse en téléchargeant le code source pour les Collections.dans le cadre java. La réponse que j'ai utilisé était de mettre la genaric dans la méthode, pas dans la définition de classe.

Donc cela a fonctionné:

public class QuickSortArray  {
    public static <T extends Comparable> void quickSort(T[] array, int bottom, int top){
//do it
}

}

Bien sûr, après avoir lu les réponses ci-dessus, j'ai réalisé que ce serait une solution de rechange acceptable sans l'aide d'un genaric classe:

public static void quickSort(Comparable[] array, int bottom, int top){
//do it
}

16voto

BD at Rivenhill Points 1738

Il est possible de faire ce que vous voulez en utilisant la syntaxe de méthodes génériques lors de la déclaration de votre doIt() méthode (remarquer l'ajout de la <T> entre static et void à la signature de la méthode de doIt()):

class Clazz<T> {
  static <T> void doIt(T object) {
    // shake that booty
  }
}

J'ai eu l'Éclipse de l'éditeur pour accepter le code ci-dessus sans l' Cannot make a static reference to the non-static type T d'erreur, puis étendu à la suite de son programme de travail (avec un peu appropriés à l'âge de référence culturelle):

public class Clazz<T> {
  static <T> void doIt(T object) {
    System.out.println("shake that booty '" + object.getClass().toString()
                       + "' !!!");
  }

  private static class KC {
  }

  private static class SunshineBand {
  }

  public static void main(String args[]) {
    KC kc = new KC();
    SunshineBand sunshineBand = new SunshineBand();
    Clazz.doIt(kc);
    Clazz.doIt(sunshineBand);
  }
}

Qui imprime ces lignes dans la console quand je le lance:

shake that booty " class com.eclipseoptions.datamanager.Clazz$KC' !!!
shake that booty " class com.eclipseoptions.datamanager.Clazz$SunshineBand' !!!

4voto

skaffman Points 197885

D'autres ont répondu à votre question déjà, mais en plus je peux soigneusement recommande d'O'Reilly Java Génériques livre. C'est un subtil et complexe à la fois, et si souvent semble inutile de restrictions, mais le livre fait un assez bon travail en expliquant pourquoi java génériques sont comme elles sont.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X