2010-08-11 8 views
2

Comment vérifier le type d'un paramètre générique en Java (sans utiliser de réflexion si possible)?Résolution de la méthode générique, type de paramètre générique en Java comme en C#?

La cible est quelque chose comme C# permet de faire:

public <T> void doStaff() { 

    if(T is Type1) { 

    } 

    if(T is Type2) { 

    } 

} 

Comment écrire une méthode comme celle en Java?

+0

Quel est le but? Je suis désemparé de ce que vous faites .... –

+0

vous pouvez utiliser le mot-clé JAVA mot-clé: http://www.java2s.com/Tutorial/Java/0060__Operators/TheinstanceofKeyword.htm –

+0

@The Gentleman Elite, Comme dans Les interfaces Java ne peuvent pas être implémentées explicitement, je voulais faire une méthode qui dépend du type générique utilisé faire une opération. Mais pour être honnête, je suis juste curieux. –

Répondre

3

Les informations génériques dans Java sont effacées lors de l'exécution. Vous ne pouvez jamais faire quelque chose comme "T instanceof". Cependant, vous pouvez passer quelque chose dans la méthode, et faire une instanceof une référence, comme ceci:

public T void doStaff(T t) { 
    if (t instanceof Type1) {...} 

} 

Pour le rendre plus clair, T est un paramètre générique, qui disparaît lors de l'exécution. t est une référence sur laquelle vous pouvez travailler lors de l'exécution.

4
public <T> void doStaff(Class<T> type) { 
    if (Type1.class.isAssignebleFrom(type)) {.. } 
    if (Type2.class.isAssignebleFrom(type)) {.. } 
} 
0

Utilisez la méthode Class.isAssignableFrom(Class) sur la classe du type

import java.io.Serializable; 
import java.util.Hashtable; 

    public class Test<T> { 

     private T t; 

     public void set(T t) { 
      this.t = t; 
     } 

     private T get() { 
      if(Serializable.class.isAssignableFrom(t.getClass())) { 
       System.out.println("Hurray!!!"); 
      } 
      return t; 
     } 

     public static void main(String[] args) { 
      Test<Hashtable> test = new Test<Hashtable>(); 
      test.set(new Hashtable());  
      test.get(); // prints Hurray!! 
     } 

    } 
0

Java utilise l'effacement de type pour gérer les médicaments génériques. Cela signifie que toutes les informations sur les génériques ne sont vérifiées qu'au moment de la compilation, et que le bytecode résultant n'a aucune référence au fait que des génériques ont été utilisés.

List<String> stringList = new ArrayList<String>(); 
stringList.add("foo"); 
String s = stringList.get(0); 

sera (après avoir fait des contrôles de temps de compilation sur les paramètres génériques) seront essentiellement compilez à la même chose que

List stringList = new ArrayList(); 
stringList.add("foo"); 
String s = (String)(stringList.get(0)); 

Ce que cela signifie est que vous ne pouvez pas faire des contrôles d'exécution sur un générique paramètre directement, comme ce que vous essayez de faire. Si vous avez un objet spécifique d'un type générique, vous pouvez utiliser l'opérateur instanceof pour déterminer si cet objet est une instance d'une classe spécifique, mais vous ne pouvez rien faire sur le paramètre générique lui-même, car obtient effacé par type à l'exécution.

Questions connexes